参考:https://blog.csdn.net/wingrez/article/details/82320846
问题描述
试题编号: | 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 <iostream>
#include <vector>
#include <cstring>
#define MAXN 105
using namespace std;
char rules[MAXN][MAXN],name[MAXN][MAXN];
char arr[MAXN];
vector<string> value;
int n,m;
bool match(char *array,char *rule) {
value.clear();
int i=0,j=0;
while(i<strlen(array) && j<strlen(rule)) {
if(rule[j]=='<') {
string tmp;
if(rule[j+1]=='i') {
int flag=0;//判断是否有前导0
while(array[i]!='\0' && array[i]!='/') {
if(array[i]<'0' || array[i]>'9')
return false;
if(flag==0 && array[i]=='0') {
i++;
continue;
}
flag=1;
tmp+=array[i];
i++;
}
}
else if(rule[j+1]=='s') {
while(array[i]!='\0' && array[i]!='/') {
tmp+=array[i];
i++;
}
}
else if(rule[j+1]=='p') {
while(array[i]!='\0') {
tmp+=array[i];
i++;
}
value.push_back(tmp);
return true;
}
value.push_back(tmp);
if(strchr(rule+j,'/')!=NULL) {
j=strchr(rule+j,'/')-rule;
}
else
j=strlen(rule);
continue;
}
if(array[i]==rule[j]) {
i++;
j++;
continue;
}
return false;
}
if(i==strlen(array) && j==strlen(rule)) {
return true;
}
return false;
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++) {
cin>>rules[i]>>name[i];
}
for(int i=1;i<=m;i++) {
cin>>arr;
int j,flag=0;
for(j=1;j<=n;j++) {
if(match(arr,rules[j])) {
flag=1;
break;
}
}
if(flag==1) {
cout<<name[j]<<" ";
for(int k=0;k<value.size();k++) {
cout<<value[k].c_str()<<" ";
}
cout<<endl;
} else {
cout<<"404"<<endl;
}
}
return 0;
}