1. 程式人生 > >ccf 2018 練習題 3 url對映

ccf 2018 練習題 3 url對映

研究了幾個小時,發現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;
}