研究了几个小时,发现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;
}