试题编号: | 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。 |
30分
using namespace std;
// 201803-3 URL映射
struct Rule {
string rule, name; //规则 名字
int num = 0; //表示规则包含的内容数
bool flag = 1; //表示最后一位是否为‘/’
vector<string> r; //放置规则的内容
};
bool Judge_Int(string s)
{
for (int i = 0; i < s.size(); i++)
{
if (s[i] < 48 || s[i]>57)
return 0;
}
return 1;
}
string STR_TO_INT(string s)
{
int i = 0,num = s.size();
string o = s;
while (o[0] == '0')
{
o.erase(0,1);
}
//cout << "ok" << endl;
if (o.empty())
o = "0";
return o;
}
int main()
{
int i, j, N, M;
cin >> N >> M;
Rule R[100], Out[100];
for (i = 0; i < N; i++)
{
int p1 = 0, p2 = 0;
cin >> R[i].rule >> R[i].name;
string Save = R[i].rule;
Save[0] = '*';
while ((p2 = Save.find('/')) != -1)
{
string ss = Save.substr(p1 + 1, p2 - p1 - 1);
R[i].r.push_back(ss);
R[i].num++;
p1 = p2;
Save[p2] = '*';
}
if (Save[Save.size() - 1] != '*') //说明还有一个规则的内容
{
string ss = Save.substr(p1 + 1, Save.size() - p1 - 1);
R[i].r.push_back(ss);
R[i].num++;
R[i].flag = 0;
}
//for (int t = 0; t < R[i].num; t++)
// cout << R[i].r[t] << endl;
}
for (j = 0; j < M; j++)
{
int p1 = 0, p2 = 0;
cin >> Out[j].rule ;
string Save = Out[j].rule;
Save[0] = '?';
while ((p2 = Save.find('/')) != -1)
{
string ss = Save.substr(p1 + 1, p2 - p1 - 1);
Out[j].r.push_back(ss);
Out[j].num++;
p1 = p2;
Save[p2] = '*';
}
if (Save[Save.size() - 1] != '*') //说明还有一个规则的内容
{
string ss = Save.substr(p1 + 1, Save.size() - p1 - 1);
Out[j].r.push_back(ss);
Out[j].num++;
Out[j].flag = 0;
}
int flag = 1;
for (i = 0; i < N; i++)
{
if (Out[j].r[0] == R[i].r[0])
{
flag = 1;
for (int t = 1; t < R[i].num; t++)
{
if (R[i].r[t] == "<path>")
{
int k = t, pp;
while (k--)
{
pp = Save.find('*');
Save[pp] = '?';
}
Out[j].r[t] = Out[j].rule.substr(pp + 1, Out[j].rule.size() - pp - 1);
flag = 2;
}
else if (R[i].r[t] != "<str>" && R[i].r[t] != "<int>")
{
if (Out[j].r[t] != R[i].r[t]) //不匹配
{
flag = 0;
break;
}
}
else if (R[i].r[t] == "<int>")
{
if (!Judge_Int(Out[j].r[t]))
{
flag = 0;
break;
}
}
}
if (flag == 1 && (R[i].flag != Out[j].flag || R[i].num != Out[j].num))
{
flag = 0;
}
if (flag == 1|| flag == 2)
{
cout << R[i].name << " ";
for (int t = 1; t < R[i].num; t++)
{
if (R[i].r[t] == "<str>")
cout << Out[j].r[t] << " ";
else if (R[i].r[t] == "<int>")
cout << STR_TO_INT(Out[j].r[t]) << " ";
else if (R[i].r[t] == "<path>")
{
cout << Out[j].r[t] << " ";
break;
}
}
cout << endl;
break;
}
//
}
}
if(flag == 0)
cout << 404 << endl;
}
cin >> N;
return 0;
}
40分
using namespace std;
// 201803-3 URL映射
struct Rule {
string rule, name; //规则 名字
int num = 0; //表示规则包含的内容数
bool flag = 1; //表示最后一位是否为‘/’
vector<string> r; //放置规则的内容
};
bool Judge_Int(string s)
{
for (int i = 0; i < s.size(); i++)
{
if (s[i] < '0' || s[i]>'9')
return 0;
}
return 1;
}
string STR_TO_INT(string s)
{
int i = 0,num = s.size();
string o = s;
while (o[0] == '0')
{
o.erase(0,1);
}
if (o.empty())
o = "0";
return o;
}
int main()
{
int i, j, N, M;
cin >> N >> M;
Rule R[100], Out[100];
for (i = 0; i < N; i++)
{
int p1 = 0, p2 = 0;
cin >> R[i].rule >> R[i].name;
string Save = R[i].rule;
Save[0] = '*';
while ((p2 = Save.find('/')) != -1)
{
string ss = Save.substr(p1 + 1, p2 - p1 - 1);
R[i].r.push_back(ss);
R[i].num++;
p1 = p2;
Save[p2] = '*';
}
if (Save[Save.size() - 1] != '*') //说明还有一个规则的内容
{
string ss = Save.substr(p1 + 1, Save.size() - p1 - 1);
R[i].r.push_back(ss);
R[i].num++;
R[i].flag = 0;
}
//for (int t = 0; t < R[i].num; t++)
// cout << R[i].r[t] << endl;
}
for (j = 0; j < M; j++)
{
int p1 = 0, p2 = 0;
cin >> Out[j].rule ;
string Save = Out[j].rule;
Save[0] = '?';
while ((p2 = Save.find('/')) != -1)
{
string ss = Save.substr(p1 + 1, p2 - p1 - 1);
Out[j].r.push_back(ss);
Out[j].num++;
p1 = p2;
Save[p2] = '*';
}
if (Save[Save.size() - 1] != '*') //说明还有一个规则的内容
{
string ss = Save.substr(p1 + 1, Save.size() - p1 - 1);
Out[j].r.push_back(ss);
Out[j].num++;
Out[j].flag = 0;
}
int flag = 1;
for (i = 0; i < N; i++)
{
//cout << "ok" << endl;
if (Out[j].r[0] == R[i].r[0])
{
flag = 1;
// 30分 -> 40分
for (int t = 1; t < R[i].num && t< Out[j].num; t++)
{
if (R[i].r[t] == "<path>")
{
int k = t, pp;
while (k--)
{
pp = Save.find('*');
Save[pp] = '?';
}
Out[j].r[t] = Out[j].rule.substr(pp + 1, Out[j].rule.size() - pp - 1);
flag = 2;
break;
}
else if (R[i].r[t] != "<str>" && R[i].r[t] != "<int>")
{
if (Out[j].r[t] != R[i].r[t]) //不匹配
{
flag = 0;
break;
}
}
else if (R[i].r[t] == "<int>")
{
if (!Judge_Int(Out[j].r[t]))
{
flag = 0;
break;
}
}
}
if (flag == 1 && (R[i].flag != Out[j].flag || R[i].num != Out[j].num))
{
flag = 0;
}
if (flag == 1|| flag == 2)
{
cout << R[i].name << " ";
for (int t = 1; t < R[i].num; t++)
{
if (R[i].r[t] == "<str>")
cout << Out[j].r[t] << " ";
else if (R[i].r[t] == "<int>")
cout << STR_TO_INT(Out[j].r[t]) << " ";
else if (R[i].r[t] == "<path>")
{
cout << Out[j].r[t] << " ";
break;
}
}
cout << endl;
break;
}
}
}
if(flag == 0)
cout << 404 << endl;
}
cin >> N;
return 0;
}
满分参考https://blog.csdn.net/xbb224007/article/details/79962425