ccf 2018 練習題 3 url對映
阿新 • • 發佈:2019-02-17
研究了幾個小時,發現C/C++語言對regex的支援並不是很好,相比之下php的正則好用到爆啊
當然最重要的是,即將到來的ccf考試系統不支援regex。。所以,,,就不改了,就這樣吧
下面是一坨shi。。。。
看了網上一些思路,於是就把url先分塊。
但是實際操作以後覺得,不分塊可能會簡單點……當然這是我猜的,有待證實。
不避諱地說,下面的程式碼十分垃圾。但是能通過測試用例~~~~我就懶得改了。
#include <iostream> #include <string> using namespace std; class url{ public: string parts[51]; bool hasend; int len; url(){ len=0; } void clear(){ len=0; for(int i=0;i<51;i++){ parts[i]=""; } } }; string str="",ans=""; url urls[100],aurl; string names[100]; int m,n,len,k0; bool flag; // and int bool ischar(char a){ if((a<='z'&&a>='a')||(a<='Z'&&a>='A')||(a<='9'&&a>='0')){ return true; }else return false; } bool isint(char a){ if(a<='9'&&a>='0'){ return true; }else return false; } bool ispath(char a){ if((a<='z'&&a>='a')||(a<='Z'&&a>='A')||(a<='9'&&a>='0')|| (a=='_')||(a=='.')||(a=='-')){ return true; }else return false; } //b is rule bool flag2, flag3; bool matches(url &a,url &b){ ans=""; flag2=false; if(a.parts[a.len-1].empty() xor b.parts[b.len-1].empty()){ // cout<<"failure xor / "<<endl; // cout<<"a.len="<<a.len<<" b.len="<<b.len<<endl; return false; }else if(a.parts[a.len-1].empty()){ // cout<<"both /,normal, both len-1,result: alen="<<a.len-1<<" blen="<<b.len-1<<endl; a.len--; b.len--; flag2=true; } for(int i=0,j=0;;i++){ if(i==b.len&&j==a.len){ // cout<<"success match! i==b.len&&j==a.len"<<endl; return true; }else if(i==b.len||j==a.len){ // cout<<"failure : a or b is end"<<endl; // cout<<"i j blen alen "<<i<<j<<b.len<<a.len<<endl; return false; } if(b.parts[i]=="<str>"){ // cout<<"str try:"<<endl; for(int k=0,len1=a.parts[j].length(); k<len1;k++){ if(!ischar(a.parts[j][k])){ return false; } } // cout<<"str success."<<endl; ans+=a.parts[j]+" "; j++; continue; }else if(b.parts[i]=="<int>"){ // cout<<"int try:"<<endl; for(int k=0,len1=a.parts[j].length(); k<len1;k++){ if(!isint(a.parts[j][k])){ return false; } } k0=0; while(a.parts[j][k0]=='0'){ k0++; } for(int k=k0,len1=a.parts[j].length(); k<len1;k++){ ans+=a.parts[j][k]; } // cout<<"int success."<<endl; ans+=" "; j++; continue; }else if(b.parts[i]=="<path>"){ // cout<<"path try:"<<endl; while(a.len!=j){ // cout<<"while circle..."<<endl; for(int k=0,len1=a.parts[j].length(); k<len1;k++){ if(!ispath(a.parts[j][k])){ return false; } } // cout<<"path success."<<endl; ans+=a.parts[j]; j++; if(j!=a.len)ans+='/'; } }else{ // cout<<"plain try:"<<endl; if(b.parts[i]==a.parts[j]){ // ans+=a.parts[j]+" "; j++; // cout<<"plain success."<<endl; }else{ return false; } } } } int main(){ cin>>n>>m; for(int j=0;j<n;j++){ cin>>str>>names[j]; len=str.length(); for(int i=0;i<len;i++){ if(str[i]=='/'){ urls[j].len++; // cout<<urls[j].parts[len-2]<<" "; }else{ urls[j].parts[urls[j].len-1]+=str[i]; // cout<<urls[j].parts[urls[j].len-1]<<" "; } } // cout<<"test1"<<endl; // for(int i=0;i<urls[j].len;i++){ // cout<<urls[j].parts[i]<<" "; // } // cout<<endl; } // cout<<names[0]<<endl; for(int i=0;i<m;i++){ cin>>str; len=str.length(); aurl.clear(); for(int j=0;j<len;j++){ if(str[j]=='/'){ aurl.len++; }else{ aurl.parts[aurl.len-1]+=str[j]; } } flag=false; for(int j=0;j<n;j++){ // cout<<"try rule "<<j+1<<endl; flag3=matches(aurl,urls[j]); if(flag2){ // cout<<"both ++++++++++++++++++"; aurl.len++; urls[j].len++; } if(flag3){ cout<<names[j]<<" "; cout<<ans<<endl; flag=true; break; } } if(!flag){ cout<<"404"<<endl; } } return 0; }