201803-3 URL映射
题目
思路
详见代码。
AC代码如下
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
vector<string> vc[200];
string name[100];
int n,m;
map<string,int> mp={{"<str>",0},{"<int>",1},{"<path>",2}};
bool isInt(string str){//判断是否为整数
for(int i=0;i<str.size();i++)
if(str[i]<'0'||str[i]>'9') return false;
return true;
}
bool legal(string str){//判断是否为合法URL
for(int i=0;i<str.size();i++){
if(str[i]>='0'&&str[i]<='9') continue;
if(str[i]>='a'&&str[i]<='z') continue;
if(str[i]>='A'&&str[i]<='Z') continue;
if(str[i]=='_'||str[i]=='-'||str[i]=='.'||str[i]=='/') continue;
return false;
}
return true;
}
void analyse(string str,int x){//将字符串分解至vector容器中,规则与URL统一处理
int s=1,t;
while(s<str.size()&&(t=str.find("/",s))!=string::npos){
vc[x].push_back(str.substr(s,t-s));
s=t+1;
}
if(s<str.size())
vc[x].push_back(str.substr(s,str.size()-s));
else vc[x].push_back("/");//注意最后一个斜杠
}
void Match(int x){//匹配
vector<string> ans;//记录匹配结果
for(int i=0;i<n;i++){
ans.clear();
ans.push_back(name[i]);
int j;
for(j=0;j<vc[i].size()&&j<vc[x].size();j++){
if(vc[i][j]==vc[x][j]) continue;
else if(mp.count(vc[i][j])){
if(mp[vc[i][j]]==1&&isInt(vc[x][j])){//int
while(vc[x][j][0]=='0'&&vc[x][j].size()>1) vc[x][j].erase(0,1);//去前导零
ans.push_back(vc[x][j]);
continue;
}else if(mp[vc[i][j]]==0&&vc[x][j]!="/"){//str,字符串不能为"/"
ans.push_back(vc[x][j]);
continue;
}else if(mp[vc[i][j]]==2){//path
string temp;
for(int k=j;k<vc[x].size()-1;k++)//之前分解开的现在接回去
temp+=vc[x][k]+"/";
if(vc[x][vc[x].size()-1]!="/")
temp+=vc[x][vc[x].size()-1];
ans.push_back(temp);
break;
}
}//未匹配成功,退出第i条规则的匹配
ans.clear();
break;
}
if(ans.size()==0)continue;
if(j==vc[x].size()&&j<vc[i].size())continue;//长度不一致,且匹配到了头
if(j==vc[i].size()&&j<vc[x].size()) continue;
for(int j=0;j<ans.size();j++)//输出结果
cout<<ans[j]<<" ";
cout<<endl;
return;
}
cout<<"404"<<endl;//所有规则都未匹配成功
}
int main(){
string rule,url;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>rule>>name[i];
analyse(rule,i);
}
for(int i=n;i<m+n;i++){
cin>>url;
analyse(url,i);
if(legal(url)) Match(i);
else cout<<"404"<<endl;
}
return 0;
}