问题描述
试题编号: | 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。 |
下面代码拿了90分,不过考虑到下午要考试,我就不再debug了,等考完回来之后,再仔细看看是漏了什么情况吧。
#include <string>
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
#define MAX 105
vector<string> rule;
vector<string> name;
vector<string> ans;
int isvalid(string s1,string s2)
{
int flag=1;
if(s2=="<int>")
{
int len=s1.length();
for(int i=0;i<len;i++)
{
if(s1[i]>='0'&&s1[i]<='9') continue;
else{
flag=0;
return 0;
}
}
if(flag==1&&len>0)
{
ans.push_back(s1);
}
else return 0;
}
else if(s2=="<str>")
{
int len=s1.length();
for(int i=0;i<len;i++)
{
if(s1[i]!='\\') continue;
else
{
flag=0;
return 0;
}
}
if(flag=1&&len>0)
{
ans.push_back(s1);
}
else return 0;
}
else if(s2=="<path>")
{
int len=s1.length();
if(len>0)
{
ans.push_back(s1);
return 1;
}
else
{
return 0;
}
}
else
{
if(s1==s2) return 1;
else return 0;
}
return 1;
}
int check(string s)
{
int len=s.length();
for(int i=0;i<len;i++)
{
if(s[i]>='A'&&s[i]<='Z') continue;
else if(s[i]>='a'&&s[i]<='z') continue;
else if(s[i]>='0'&&s[i]<='9') continue;
else if(s[i]=='-'||s[i]=='.'||s[i]=='_') continue;
else if(s[i]=='/') continue;
else return 0;
}
return 1;
}
int main()
{
int n,m;
freopen("a.txt","r",stdin);
cin>>n>>m;
string input="";
getline(cin,input);
for(int i=0;i<n;i++)
{
getline(cin,input);
int pos=input.find(" ");
string str1=input.substr(0,pos);
string str2=input.substr(pos+1,input.length()-pos-1);
rule.push_back(str1);
name.push_back(str2);
}
string src;
for(int i=0;i<m;i++)
{
int match=0;
getline(cin,src);
ans.clear();
int j;
for(j=0;j<n;j++)
{
string str1=rule[j];
int pos10=0;
int pos20=0;
int pos11,pos12,pos21,pos22;
int flag=0;
ans.clear();
int ending1=0;
int ending2=0;
while(src.find("/",pos10)!=string::npos&&str1.find("/",pos20)!=string::npos)
{
pos11=src.find("/",pos10);
pos21=str1.find("/",pos20);
if(pos11==src.length()-1&&pos21==str1.length()-1) break;
string s1;
string s2;
string path="<path>";
if(str1.find("/",pos21+1)!=string::npos)
{
pos22=str1.find("/",pos21+1);
s2=str1.substr(pos21+1,pos22-pos21-1);
}
else
{
s2=str1.substr(pos21+1,str1.length()-pos21-1);
ending2=1;
}
if(s2==path)
{
s1=src.substr(pos11+1,src.length()-pos11-1);
ending1=1;
}
else
{
if(src.find("/",pos10+1)!=string::npos)
{
pos12=src.find("/",pos11+1);
s1=src.substr(pos11+1,pos12-pos11-1);
}
else
{
s1=src.substr(pos11+1,src.length()-pos11-1);
ending1=1;
}
}
if(check(s1)&&isvalid(s1,s2)&&ending1==ending2)
{
if(ending1==0)
{
pos10=pos12;
pos20=pos22;
flag=1;
}
else
{
flag=1;
break;
}
}
else
{
flag=0;
break;
}
}
if(flag==1)
{
match=1;
break;
}
}
if(match==1)
{
cout<<name[j];
for(int i=0;i<ans.size();i++)
{
int flag=0;
cout<<" ";
for(j=0;j<ans[i].length();j++)
{
if(ans[i][j]=='0'&&flag==0) continue;
else{
flag=1;
cout<<ans[i][j];
}
}
}
cout<<endl;
}
else
{
cout<<"404"<<endl;
}
}
return 0;
}