题目大意
按给定规则进行两个字符串的匹配
考点
大模拟 + 字符串
思路
三重循环,第一层循环枚举给定URL串,第二层循环按顺序匹配每条规则,第三层循环依次匹配URL的每一段(以/为分隔符)
为了性能更加优秀,用char数组来存字符串,其实用string也可以。
易错点
- 别忘了去掉前导0
- 对于< str>和< path>不仅要判断匹配,还要判断URL合法
- 仔细读题:”以上3 种参数都必须匹配非空的字符串”
收获
- char数组以’\0’为字符串结尾,初始化时最好memset(0)
满分代码
#include <bits/stdc++.h>
using namespace std;
const int N=220,mod=929;
#define pb push_back
int n,m,len[N];
char rul[N][N],nam[N][N],s[N];
bool legal(char c){
return isdigit(c) || isalpha(c) || c=='-' || c=='_' || c=='.';
}
string killzero(string ts){
if(ts.length()<2)return ts;
int i=0;
for(i=0;i<(int)ts.length()-1;i++){
if(ts[i]!='0')break;
}
string res;
for(;i<(int)ts.length();i++)res+=ts[i];
return res;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++)cin>>rul[i]>>nam[i];
for(int i=0;i<m;i++){
memset(s,0,sizeof s);
cin>>s;
vector<string> ref;
bool flag=0;
for(int j=0;j<n;j++){
bool fg=1;
int r=1,l=1;
while(rul[j][r]){
char unit[N]={'\0'};
int cnt=0;
string ts;
for(;rul[j][r] && rul[j][r]!='/';r++)unit[cnt++]=rul[j][r];
int op=0;
if(strcmp(unit,"<int>")==0)op=1;
else if(strcmp(unit,"<str>")==0)op=2;
else if(strcmp(unit,"<path>")==0)op=3;
if(op==0){
int k=0;
//1.匹配出错
for(k=0;s[l+k] && k<cnt;k++){
if(s[l+k]!=unit[k]){
fg=0;
break;
}
}
//2.URL长度不够
if(k<cnt){
fg=0;
break;
}
l+=k;
}
else if(op==1){
int k=0;
for(k=0;s[l+k];k++){
if(!isdigit(s[l+k])){
break;
}
ts+=s[l+k];
}
//至少应有一个数字
if(k==0){
fg=0;
break;
}
l+=k;
ts=killzero(ts);//去掉前导0
ref.pb(ts);
}
else if(op==2){
int k=0;
for(k=0;s[l+k] && s[l+k]!='/';k++){
if(!legal(s[l+k])){
fg=0;
break;
}
ts+=s[l+k];
}
//至少应有一个字
if(k==0){
fg=0;
break;
}
//非法字符
if(!fg)break;
l+=k;
ref.pb(ts);
}
else{
int k=0;
for(k=0;s[l+k];k++){
if(!legal(s[l+k]) && s[l+k]!='/'){
fg=0;
break;
}
ts+=s[l+k];
}
//至少应有一个字
if(k==0){
fg=0;
break;
}
//非法字符
if(!fg)break;
l+=k;
ref.pb(ts);
}
//记录答案
if(rul[j][r]){
if(!s[l] || s[l]!=rul[j][r]){
fg=0;
break;
}
l++;
r++;
}
else{
if(s[l])fg=0;//URL过长
break;
}
}
//成功匹配,且匹配完毕
if(!s[l] && fg){
cout<<nam[j];
for(auto sref:ref){
cout<<" "<<sref;
}
cout<<endl;
flag=1;
break;
}
else{
ref.clear();
}
}
if(!flag)cout<<"404\n";
}
return 0;
}