CSP URL映射

在这里插入图片描述
找不出错了。。。很郁闷

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值