问题描述:
试题编号: | 201803-3 |
试题名称: | URL映射 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。 输入格式 输入第一行是两个正整数 n 和 m,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。 输出格式 输入共 m 行,第 i 行表示 qi 的匹配结果。如果匹配成功,设匹配了规则 pj ,则输出对应的 rj。同时,如果规则中有参数,则在同一行内依次输出匹配后的参数。注意整数参数输出时要把前导零去掉。相邻两项之间用一个空格字符分隔。如果匹配失败,则输出 404。 样例输入 5 4 样例输出 year_archive 2004 样例说明 对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。 数据规模和约定 1 ≤ n ≤ 100,1 ≤ m ≤ 100。 |
1、因为匹配的字符串长度不一定相等所以要用两个循环变量分别表示两个字符串中的位置。
2、注意初始化。字符串的清空可用clear()函数。
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
string type[101],para[101];//参数类型,具体参数
int t;//参数的个数
bool isstr(char c)//是否是阿拉伯数字,大小写字母,-,_,.
{
if(c>='0'&&c<='9') return 1;
else if((c>='A'&&c<='Z')||(c>='a'&&c<='z')) return 1;
else if(c=='-'||c=='_'||c=='.') return 1;
else return 0;
}
bool islegal(string a,string b)//匹配函数
{
int ia=0,ib=0,la=a.length(),lb=b.length();
int m,n,j;
t=0;//重置为0
bool flag=1;
while(1)
{ //一个字符串到达末尾时判断另一个字符串的状况
if(ib>=lb)
{
if(ia>=la) return 1;
else return 0;
}
else if(ia>=la)
{
if(ib>=lb) return 1;
else return 0;
}
if(a[ia]!='<')
{
if(a[ia]!=b[ib]) return 0;
ia++;ib++;
}
else if(a[ia]=='<')
{
m=ia+1;
++t;//出现'<',参数个数加一
type[t].clear();para[t].clear();//清空
while(a[ia]!='/'&&ia<la) ++ia;//ia为斜杠处,若无斜杠则为末尾
//斜杠左边一位一定是‘>’
for(j=m;j<ia-1;j++) type[t]+=a[j];
n=ib;
if(type[t]=="int")
{
while(b[ib]!='/'&&ib<lb) ++ib;//ib为斜杠处,若无斜杠则为末尾
for(j=n;j<ib;j++)
{
if((b[j]<'0'||b[j]>'9')) return 0;
else para[t]+=b[j];
}
while(para[t][0]=='0') para[t]=para[t].substr(1);//去掉前导零
}
else if(type[t]=="str")
{
while(b[ib]!='/'&&ib<lb) ++ib;//ib为斜杠处,若无斜杠则为末尾
for(j=n;j<ib;j++)
{
if(!isstr(b[j])) return 0;
else para[t]+=b[j];
}
}
else if(type[t]=="path")
{
for(j=n;j<lb;j++) para[t]+=b[j];
ib=lb;
}
}
}
}
int main()
{
int n,m,i;
string str,p[101],r[101];
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>p[i]>>r[i];
while(m--)
{
cin>>str;
for(i=1;i<=n;i++)
{
if(islegal(p[i],str))
{
cout<<r[i]<<' ';
for(int j=1;j<=t;j++) cout<<para[j]<<' ';
break;
}
if(i==n) cout<<"404";
}
cout<<endl;
}
}