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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值