CCF201803-3-URL映射

链接:http://118.190.20.162/view.page?gpid=T71

思路:    按要求顺序写出n、m、p[i]、r[i]

    接着每次输入一行匹配

    将匹配的两个字符串进行切割,存入数组,逐一比对,符合要求就输出

    题目本身不难吧,觉得复杂,不敢做,一点一点想清楚也挺舒服的,具体看代码吧,写了注释

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <algorithm>

    using namespace std;

    string p[150],r[150];
    void split(vector<string> &v, string s)
    {
        //cout<<"s:"<<s<<endl;
        string ss;
        v.clear();
        for(int i=1;i<s.size();i++)
        {
            //cout<<"ss:"<<ss<<endl;
            if(s[i]=='/')
            {
                v.push_back(ss);
                ss.clear();
            }
            else
                ss+=s[i];
        }
        if(ss.size())
            v.push_back(ss);
    //    for(vector<string>::iterator it=v.begin();it!=v.end();it++)
    //        cout<<*it<<endl;
    }

    string judge(string s)
    {
        int t=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]<'0'||s[i]>'9')
            {
                t=1;
                break;
            }
        }
        if(t==1)
            return "<str>";
        else
            return "<int>";
    }

    vector<string> ans;
    bool match(string s1,string s2)//s1是规则,s2是要对比的
    {
        ans.clear();//每次将存储答案的数组清零
        vector<string> r1,m1;
        int  l=1;
        split(r1,s1);//切割字符串
        split(m1,s2);//r1是规则,m1是查询字符串数组
        //cout<<r1.size()<<endl<<m1.size()<<endl;
        if(r1.size()>m1.size())//
            return false;
        if(r1.size()<m1.size()&&r1.size()>=1)
            if(r1[r1.size()-1]!="<path>")
                return false;
        if(r1.size()==0&&m1.size()!=0)
            return false;
        for(int i=0;i<r1.size();i++)
        {
            //cout<<r1[i]<<endl;
            if(r1[i]==m1[i])
            {
                l=l+m1[i].size()+1;
                continue;
            }
            else if(r1[i]=="<path>")
            {
                ans.push_back(s2.substr(l,s2.size()-l));
                return true;
            }
            else if(r1[i]==judge(m1[i]))
            {
                ans.push_back(m1[i]);
                l=l+m1[i].size()+1;
            }
            else
                return false;
        }
        if(s1[s1.size()-1]=='/'&&s2[s2.size()-1]!='/')
            return false;
        if(s1[s1.size()-1]!='/'&&s2[s2.size()-1]=='/')
            return false;
        return true;
    }

    int convert(string s)
    {
        int ans=0;
        for(int i=0;i<s.size();i++)
        {
            ans=ans*10+(s[i]-'0');
        }
        return ans;
    }
    int main()
    {
        int n,m;
        string s;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            cin>>p[i]>>r[i];
        }
        for(int i=0;i<m;i++)
        {
            cin>>s;
            int flag=0;
            int j;
            for(j=0;j<n;j++)
            {
                flag=match(p[j],s);//将输入的s和前面n个规则比对
                if(flag)
                    break;
            }
            if(flag==0)
            {
                cout<<404<<endl;
                continue;
            }
            cout<<r[j];
            for(int k=0;k<ans.size();k++)
            {
                if(judge(ans[k])=="<int>")
                    cout<<" "<<convert(ans[k]);
                else
                    cout<<" "<<ans[k];
            }
            cout<<endl;
        }
        return 0;
    }
AC Code

 

posted @ 2018-09-08 21:45  子诚-  阅读(470)  评论(0编辑  收藏  举报