【CCF】URL映射 模拟

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<cmath>
  6 #include<algorithm>
  7 #include<queue>
  8 #include<map>
  9 using namespace std;
 10 int n,m;
 11 const int maxn=1e2+2;
 12 string rule[maxn],value[maxn];
 13 string s,t;
 14 int lens,lent;
 15 bool legal(){
 16     for(int i=0;i<lent;i++){
 17         if(t[i]>='a'&&t[i]<='z') continue;
 18         if(t[i]>='A'&&t[i]<='Z') continue;
 19         if(t[i]>='.'||t[i]=='-'&&t[i]=='_') continue;
 20         return false;
 21     }
 22     return true;
 23 }
 24 bool check(){
 25     lens=s.length();
 26     int i=0,j=0;
 27     while(i<lens&&j<lent){ 
 28         if(s[i]==t[j]){
 29             i++;
 30             j++;
 31             continue;
 32         }
 33         if(s[i]!='<') return false;
 34         if(s[i+1]=='i'){
 35             i+=5;
 36             while(j<lent){
 37                 if(t[j]>='0'&&t[j]<='9') j++;
 38                 else if(t[j]=='/') break;
 39                 else return false;
 40             }
 41         }else if(s[i+1]=='s'){
 42             i+=5;
 43             while(j<lent){
 44                 if(t[j]!='/') j++;
 45                 else break;
 46             }
 47         }else if(s[i+1]=='p'){
 48             return true;
 49         }
 50     }
 51     if(i!=lens||j!=lent) return false;
 52     return true;
 53 }
 54 void print(int id){
 55     cout<<value[id];
 56     int i=0,j=0;
 57     while(i<lens&&j<lent){
 58         if(s[i]==t[j]){
 59             i++;
 60             j++;
 61             continue;
 62         }
 63         if(s[i+1]=='i'){
 64             cout<<" ";
 65             i+=5;
 66             int flag=1;
 67             while(j<lent){
 68                 if(t[j]=='/') break;
 69                 if(flag&&t[j]=='0'){
 70                     j++;
 71                     continue;
 72                 }
 73                 cout<<t[j];
 74                 flag=0;
 75                 j++;
 76             }
 77         }else if(s[i+1]=='s'){
 78             i+=5;
 79             cout<<" ";
 80             while(j<lent){
 81                 if(t[j]=='/') break;
 82                 cout<<t[j];
 83                 j++;
 84             }
 85         }else if(s[i+1]=='p'){
 86             cout<<" ";
 87             while(j<lent){
 88                 cout<<t[j];
 89                 j++;
 90             }
 91         }
 92     }
 93     cout<<endl;
 94 }
 95 void work(){
 96     lent=t.length();
 97     if(!legal()){
 98         printf("404
");
 99         return;
100     }
101     for(int i=1;i<=n;i++){
102         s=rule[i];
103         if(check()){
104             print(i);
105             return;
106         }
107     }
108     printf("404
");
109     return;
110 }
111 int main(){
112     while(~scanf("%d%d",&n,&m)){
113         for(int i=1;i<=n;i++){
114             cin>>rule[i]>>value[i];
115         }
116         for(int i=1;i<=m;i++){
117             cin>>t;
118             work();
119         }
120     }
121     return 0;
122 }
原文地址:https://www.cnblogs.com/itcsl/p/9203579.html