试题编号: | 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。 |
#include<bits/stdc++.h>
using namespace std;
string rule[101];
string test[101];
string name[101];
bool f(string rul,string str,int index)
{
string temp3;
vector<string>arr;
int i,j,k;
int p1,p2,lp1,lp2;
string temp1;
string temp2;
lp1=lp2=0;
while(1)
{
p1=rul.find('/',lp1+1);
p2=str.find('/',lp2+1);
if((p1==-1)&&(p2==-1))
{
if(lp1!=rul.length()-1&&lp2==str.length()-1)
return 0;
if(lp1==rul.length()-1&&lp2!=str.length()-1)
return 0;
if(lp1!=rul.length()-1&&lp2!=str.length()-1)
{
temp1=rul.substr(lp1+1,rul.length()-lp1-1);
temp2=str.substr(lp2+1,str.length()-lp2-1);
// cout<<"temp1:"<<temp1<<" "<<"temp2:"<<temp2<<endl;
if(temp1=="<int>")
{
for(i=0;i<temp2.length();i++)
{
if(temp2[i]<'0'||temp2[i]>'9')
return 0;
}
for(i=0;i<temp2.length();i++)
{
if(temp2[i]!='0')
break;
}
if(i==temp2.length())
arr.push_back("0");
else
arr.push_back(temp2.substr(i,temp2.length()-i));
}
else if(temp1=="<str>"||temp1=="<path>")
{
arr.push_back(temp2);
}
else
{
if(temp1!=temp2)
return 0;
}
}
cout<<name[index];
for(i=0;i<arr.size();i++)
cout<<" "<<arr[i];
cout<<endl;
return 1;
}
if((p1==-1)&&(p2!=-1))
{
if((rul.length()-lp1-1)<=0||(lp1+1>rul.length()-1))
return 0;
temp3=rul.substr(lp1+1,rul.length()-lp1-1);
if(temp3=="<path>")
{
arr.push_back(str.substr(lp2+1,str.length()-lp2-1));
cout<<name[index];
for(i=0;i<arr.size();i++)
cout<<" "<<arr[i];
cout<<endl;
return 1;
}
else
return 0;
}
if((p1!=-1)&&(p2==-1))
return 0;
temp1=rul.substr(lp1+1,p1-lp1-1);
temp2=str.substr(lp2+1,p2-lp2-1);
// cout<<"temp1:"<<temp1<<" "<<"temp2:"<<temp2<<endl;
if(temp1=="<int>")
{
for(i=0;i<temp2.length();i++)
{
if(temp2[i]<'0'||temp2[i]>'9')
return 0;
}
for(i=0;i<temp2.length();i++)
{
if(temp2[i]!='0')
break;
}
if(i==temp2.length())
arr.push_back("0");
else
arr.push_back(temp2.substr(i,temp2.length()-i));
lp1=p1;
lp2=p2;
}
else if(temp1=="<str>")
{
arr.push_back(temp2);
lp1=p1;
lp2=p2;
}
else if(temp1!="<path>")
{
if(temp1!=temp2)
return 0;
lp1=p1;
lp2=p2;
}
}
}
int main()
{
int n,m;
int i,j,k;
cin>>n>>m;
for(i=0;i<n;i++)
{
cin>>rule[i]>>name[i];
}
for(i=0;i<m;i++)
{
cin>>test[i];
}
for(i=0;i<m;i++)
{
for(k=0;k<n;k++)
if(f(rule[k],test[i],k))
{
break;
}
if(k==n)
cout<<"404"<<endl;
}
}