题目来源于CCF CSP
思路解析
暴力遍历即可。
目前已知的注意的地方在于:
- 整数参数输出时要把前导零去掉。
- 题目规定规则中 和 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而
的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。 - “/”规则的出现。
可能存在我未知的一些bug,目前只有60 score.
代码解析
//201803-3 URL映射 grade:60
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<pair<string, string> > regular; //规则,输出答案
vector<string> Parameter; //参数值
bool check_str(string& str,int pos) {
int i = 0, j = 0;
string restr = regular[pos].first;
//需要同时小于待测的字串的长度和规则字串的长度
while (i < str.size() && j < restr.size()) {
//每一部分的新的开始
if (restr[j] == '/' && str[i] == '/') {
//判断是否是类型变量
if (restr[j + 1] == '<') {
//提取类型变量
int latepos = restr.find('>',j + 1);
string temp = restr.substr(j + 2, latepos - (j + 2));
int xipos;
if (i == str.size() - 1)
return false;
else
xipos = str.find('/', i + 1);
//获取变量值
string value = str.substr(i + 1, xipos - i - 1);
//为整型变量时
if (temp == "int") {
//检验是否整数部分全为整数
for (int i = 0; i < value.size(); i++) {
if (!isdigit(value[i]))
return false;
}
//放入参数值
Parameter.push_back(to_string(stoi(value)));
}
//为字符串类型时
else if (temp == "str") {
//放入参数值
Parameter.push_back(value);
}
//判断为文件路径的时的处理
else if (temp == "path") {
value = str.substr(i + 1);
Parameter.push_back(value);
return true;
}
//位置修改
i += (xipos - i);
j = restr.find('/', j + 1);
}
//不是类型变量时
else {
if (restr[j] == str[i]) {
i++;
j++;
continue;
}
else
return false;
}
}
else {
if (restr[j] == str[i]) {
i++;
j++;
continue;
}
else
return false;
}
}
if (i == str.size() && j == restr.size())
return true;
return false;
}
int main()
{
int n, m;
string str = "";
cin >> n >> m;
getchar();
while (n--) {
getline(cin, str);
string ans_string = str.substr(str.find(' ') + 1);
string re_string = str.substr(0, str.find(' '));
regular.push_back(pair<string,string> (re_string, ans_string));
}
//待测字串的输入
bool flag;
while (m--) {
cin >> str;
flag = false;
for (int i = 0; i < regular.size(); ++i) {
if (Parameter.size())
Parameter.clear();
if (check_str(str, i)) {
flag = true;
cout << regular[i].second << " ";
for (vector<string>::iterator it = Parameter.begin(); it != Parameter.end();++it) {
if (it != Parameter.end() - 1)
cout << *it << " ";
else
cout << *it;
}
cout << endl;
}
}
if (!flag)
cout << "404" << endl;
}
return 0;
}