解题思路
大模拟,基本思路是用字符串数组储存URL映射的规则,输入待处理的地址时按顺序一一匹配储存的规则,如果匹配则输出,到最后匹配的规则时输出404。此解在规则的匹配时采用的是分块匹配的方法,将待处理的地址的/ /分成若干块,再和规则对应位置的规则进行相应匹配,直到判断到最后一块。本题可能会出错的地方是对题意的理解不清晰,如<int>前后的斜杠问题,最后贴上代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>
using namespace std;
int pd(string s)
{
int f=0;
for(int i=0; i<s.length(); i++)
{
if(s[i]>'9'||s[i]<'0')
{
f=1;
break;
}
}
return f;
}
int main()
{
int n,m,f,p,p2,q,c,f2,f3,f4[10001]={0};
stringstream ss;
string a[10001],b[10001],s,ans1,ans2,ans3;
cin>>n>>m;
for(int i=0; i<n; i++)
{
cin>>a[i]>>b[i];
if(a[i][a[i].length()-1]!='/')
{
a[i]+='/';
f4[i]=1;
}
}
while(m--)
{
cin>>s;
f2=0;
if(s[s.length()-1]!='/')
{
s+='/';
c=1;
f2=1;
}
else c=0;
for(int i=0; i<n; i++)
{
f=1;
ans1="";
ans2="";
ans3="";
p=0;
p2=0;
while(p!=a[i].length()-1||p2!=s.length()-1)
{
ans1="";
ans2="";
for(int j=p+1; j<a[i].length(); j++)
{
if(a[i][j]=='/')
{
p=j;
break;
}
ans1+=a[i][j];
}
if(ans1=="<path>"&&f==1)
{
for(int j=p2+1; j<s.length()-1; j++)
{
ans2+=s[j];
}
if(c==0)ans2+=s[s.length()-1];
ans3+=' '+ans2;
break;
}
for(int j=p2+1; j<s.length(); j++)
{
if(s[j]=='/')
{
p2=j;
break;
}
ans2+=s[j];
if(j==s.length()-1)p2=j;
}
if(f2==1&&p2==s.length()-1&&f4[i]==0)f3=0;
else if(f4[i]==1&&f2==0&&p2==s.length()-1)f3=0;
else f3=1;
if(ans1=="<int>"&&pd(ans2)==0&&ans2!=""&&f3==1)
{
f=1;
if(ans2[0]=='0')
{
ss<<ans2;
ss>>q;
ss.clear();
ss<<q;
ss>>ans2;
ss.clear();
}
ans3+=' '+ans2;
}
else if(ans1=="<str>"&&ans2!=""&&f3==1)
{
f=1;
ans3+=' '+ans2;
}
else if(ans1==ans2&&f3==1)
{
f=1;
}
else
{
f=0;
break;
}
}
if(f==1)
{
cout<<b[i]<<ans3<<endl;
break;
}
}
if(f==0) cout<<"404"<<endl;
}
}