以上 3 種參數都必須匹配非空的字符串。簡便起見,題目規定規則中
第 n+2 行至第 n+m+1 行描述待處理的 URL 地址。第 n+1+i 行包含一個字符串 qi,表示待處理的 URL 地址,字符串中不包含空格字符。c++
輸入共 m 行,第 i 行表示 qi 的匹配結果。若是匹配成功,設匹配了規則 pj ,則輸出對應的 rj。同時,若是規則中有參數,則在同一行內依次輸出匹配後的參數。注意整數參數輸出時要把前導零去掉。相鄰兩項之間用一個空格字符分隔。若是匹配失敗,則輸出 404。web
5 4
/articles/2003/ special_case_2003
/articles/
/articles/
/articles/
/static/
/articles/2004/
/articles/1985/09/aloha/
/articles/hello/
/static/js/jquery.js
year_archive 2004
article_detail 1985 9 aloha
404
static_serve js/jquery.js數據結構
對於第 1 個地址 /articles/2004/,沒法匹配第 1 條規則,能夠匹配第 2 條規則,參數爲 2004。
對於第 2 個地址 /articles/1985/09/aloha/,只能匹配第 4 條規則,參數依次爲 198五、9(已經去掉前導零)和 aloha。
對於第 3 個地址 /articles/hello/,沒法匹配任何一條規則。
對於第 4 個地址 /static/js/jquery.js,能夠匹配最後一條規則,參數爲 js/jquery.js。框架
1 ≤ n ≤ 100,1 ≤ m ≤ 100。
全部輸入行的長度不超過 100 個字符(不包含換行符)。
保證輸入的規則都是合法的。url
#include <bits/stdc++.h> using namespace std; const int maxn = 105; int n,m; typedef pair<int,string> P; vector<P> url[maxn]; string msg[maxn]; void output() { for(int i=0;i<n;i++) { vector<P>::iterator iter; for(iter = url[i].begin();iter!=url[i].end();iter++) { cout<<iter->first<<" "<<iter->second<<endl; } } } int strType(string s) { int flag=1; for(int i=0;i<s.size();i++) { if(s[i] >'9'||s[i]<'0') flag = max(2,flag); if(s[i] == '-'||s[i]=='_'||s[i]=='.') flag = 3; } if(s[0]=='/') flag = 4; return flag; } string path(int i,vector<string> ss) { string s; s = ss[i]; for(i++;i<ss.size();i++) { s = s + "/" + ss[i]; } return s; } void input() { cin>>n>>m; string s; for(int i=1;i<=n;i++) { cin>>s>>msg[i]; for(int j=1;j<s.size();j++) { string s2; if(s[j]=='/')continue; for(;j<s.size()&&s[j]!='/';j++) s2+=s[j]; if(s2=="<int>"){ url[i].push_back(P(1,"")); }else if(s2=="<str>"){ url[i].push_back(P(2,"")); }else if(s2=="<path>"){ url[i].push_back(P(3,"")); }else url[i].push_back(P(0,s2)); } if(s[s.size()-1] == '/') url[i].push_back(P(4,"/")); } // ²éѯ while(m--) { cin>>s; vector<string> ss; for(int i=1;i<s.size();i++) { string s2; if(s[1]=='/')continue; for(;i<s.size()&&s[i]!='/';i++) s2+=s[i]; ss.push_back(s2); } if(s[s.size()-1] == '/') ss.push_back("/"); // Æ¥Åä string para[maxn]; int num=0; int flag = 0; for(int i=1;i<=n&&!flag;i++) { int point1=0,point2=0; num=0; if(ss.size()>=url[i].size()) for(;point1<url[i].size()&&point2<ss.size();point1++,point2++) { string str2 = ss[point2]; int str2Type=strType(str2); // path if(url[i][point1].first == 3){ flag = i; para[num++] = path(point2,ss); break; } else if(url[i][point1].first==0){ if(url[i][point1].second == ss[point2])continue; else break; } else if(url[i][point1].first == str2Type){ if(str2Type==1) { string sss; int k=0; while(str2[k]=='0'&&k<s.size()-1)k++; str2 = str2.substr(k); } para[num++] = str2; }else break; } if(point2==ss.size()) flag = i; } if(!flag) cout<<"404"<<endl; else { cout<<msg[flag]<<" "; for(int i=0;i<num&¶[i]!="/";i++) cout<<para[i]<<" "; cout<<endl; } } } int main() { //freopen("I:/new 1.txt","r",stdin); input(); //output(); return 0; }