#include<iostream>
using namespace std;
#include<vector>
#include<string>
#define N 105
int n,m;
struct Rules{ //存入规则
string path;
string name;
}rr[N];
string get_del(string xx) //如果不是整数,返回空串,否则返回去除前导0的整数
{
for(int i=0;i<xx.size();i++)
{
if(xx[i]>='0' && xx[i]<='9')
;
else return "";
}
int i=0;
while(i<xx.size()-1 && xx[i]=='0') //注意消除前导0,如果全是0000,要保留最后一个0
i++;
return xx.substr(i);
}
vector<string> work(Rules rule,string str)
{
vector<string> ans(1);
int i,j;
for(i=1,j=1;i<str.size() && j<rule.path.size();i++,j++)
{
int u=i;
int v=j;
while(u<str.size() && str[u]!='/')
u++;
while(v<rule.path.size() && rule.path[v]!='/')
v++;
string aa=str.substr(i,u-i);
string bb=rule.path.substr(j,v-j);
if(bb=="<int>")
{
string backk;
backk=get_del(aa);
if(backk!="")
ans.push_back(backk);
else {
ans.clear();
// ans.push_back("")
return ans;
}
}else if(bb=="<str>")
{
ans.push_back(aa);
}else if(bb=="<path>")
{
string cc=str.substr(i);
ans.push_back(cc);
return ans;
}else{
if(aa==bb)
;
else {
ans.clear();
return ans;
}
}
i=u;
j=v;
}
//注意如果完全匹配,当字符串末尾是'/'的时候,i,j会等于size,如果不是'/',i,j会等于size+1
if((j-rule.path.size()) != (i-str.size())) //如果遍历到最后:当末尾是'/',下标变为size(),否则下标为size()+1, 只有满足遍历到最后,且(j-rule.path.size()) == (i-str.size())才算匹配成功
{
ans.clear();
return ans;
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
string pp,nn;
cin>>pp>>nn;
rr[i].path=pp;
rr[i].name=nn;
}
for(int i=0;i<m;i++)
{
string str;
cin>>str;
vector<string> ans;
int ok=0;
for(int j=0;j<n;j++)
{
ans=work(rr[j],str); //进行1v1匹配,如果返回不为空,则说明匹配成功
if(ans.size())
{
cout<<rr[j].name<<" ";
for(int k=1;k<ans.size();k++)
cout<<ans[k]<<" ";
cout<<endl;
ok=1;
break;
}
}
if(!ok)
cout<<"404"<<endl;
}
}
CCF-CSP 201803-3 URL映射题解 大模拟
最新推荐文章于 2022-06-01 19:37:44 发布