CCFCSP 201803-2URL映射(60score)

tech2025-02-25  11

题目来源于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; }

最新回复(0)