找不出错了。。。很郁闷
#include<bits/stdc++.h>
using namespace std;
struct Rule{
string name;
bool flag;
vector<string> v;
}rule[105];
bool isnum(string &str){
for(int i=0;i<str.size();i++){
if('0'>str[i]||str[i]>'9')return 0;
}
return 1;
}
bool compare(string &raw,Rule &r){
stringstream ss;ss<<raw;
string t;int i=0,j=0;
vector<string> res,ans;
while(getline(ss,t,'/')){
res.push_back(t);
}
char c=raw[raw.size()-1];
for(;i<r.v.size()&&j<res.size();i++,j++){
string str=r.v[i],tmp=res[j];
if(str[0]=='<'){
if(str[1]=='i'){
if(j==res.size()-1){
if(c!='/'&&r.flag==1)return 0;
if(c=='/'&&r.flag==0)return 0;
}
if(!isnum(tmp))return 0;
else{
bool flag=0;string s;
for(int i=0;i<tmp.size();i++){
if(tmp[i]!='0')flag=1,s+=tmp[i];
else if(flag==1)s+=tmp[i];
}
if(s.size()==0)s="0";
ans.push_back(s);
}
}
else if(str[1]=='s'){
if(j==res.size()-1){
if(c!='/'&&r.flag==1)return 0;
if(c=='/'&&r.flag==0)return 0;
}
if(isnum(tmp))return 0;
else ans.push_back(tmp);
}
else if(str[1]=='p'){
if(isnum(tmp))return 0;
else{
string s;s+=tmp;j++;
for(;j<res.size();j++){
s+='/'+res[j];
}
if(j==res.size()){
if(c!='/'&&r.flag==1)return 0;
if(c=='/'&&r.flag==0)return 0;
}
if(c=='/')s+='/';
ans.push_back(s);
i++;break;
}
}
}
else{//特定字符串
if(str!=tmp)return 0;
}
}
if(j==res.size()&&i==r.v.size()){
cout<<r.name<<" ";
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<" ";
}
cout<<endl;
return 1;
}
else return 0;
}
bool check(string &str){
for(int i=0;i<str.size();i++){
if(str[i]=='/'||isalpha(str[i])||str[i]=='.'||
('0'<=str[i]&&str[i]<='9')||str[i]=='-'||str[i]=='_')continue;
else return 0;
}
return 1;
}
int main(){
#ifdef LOCAL
freopen("kk.txt","r",stdin);
#endif // LOCAL
int n,m;
cin>>n>>m;
string raw,name,tmp;
for(int i=0;i<n;i++){
cin>>raw>>name;
rule[i].name=name;
stringstream ss;ss<<raw;
while(getline(ss,tmp,'/')){
rule[i].v.push_back(tmp);
}
if(raw[raw.size()-1]=='/')rule[i].flag=1;
else rule[i].flag=0;
}
for(int i=0;i<m;i++){
cin>>raw;
bool flag=0;
if(check(raw)){
for(int j=0;j<n;j++){
if(compare(raw,rule[j])){flag=1;break;}
}
}
if(flag==0)cout<<404<<endl;
}
return 0;
}