CCF--201803 URL

题目一如既往的冗长~

这一题小菜鸡我一直没有过,后来是在网上模仿大佬思路写的。

仍然是信息的提取,但有坑!!具体的,代码注释上有:

#include <bits/stdc++.h>
using namespace std;
string Rules[100],Name[100];
void GetInfo(vector<string> &v,string s)//去'/'取信息 
{
    v.clear();
    string temp;
    for(size_t i=1;i<s.size();i++)
    {
        if(s[i]=='/'){
            v.push_back(temp);
            temp.clear();
        }
        else{
            temp+=s[i];
        } 
    }
    if(temp.size()!=0){
        v.push_back(temp);
    }
} 
string Check(string s)
{
    for(size_t i=0;i<s.size();i++)
    {
        if(s[i]<'0'||s[i]>'9'){
            return "<str>";
        }
    }
    return "<int>";
}
vector<string> Answer;//存答案 
bool Judge(string s,string rules)//所有否定情况都举出,都不符,则真 
{
    Answer.clear();//现将Answer 初始化 
    vector<string> ju1,ru2;
    int count=1;  //辅助读取 <path> 
    GetInfo(ju1,s);
    GetInfo(ru2,rules);

    if(ru2.size()>=1)
     if((ju1.size()>ru2.size())
        &&(ru2[ru2.size()-1]!="<path>")) {
        return false;    
        }
    if(ju1.size()<ru2.size()){//judge不可能小 
        return false;
    }
    if(ru2.size()==0&&ju1.size()!=0) return false;
    ///////////
    if(ju1.size()>=ru2.size())//大于时,到rule的最后一项必然会有不同 
    {
        for(size_t i=0;i<ru2.size();i++)//从最初的一节开始遍历 
        {
            if(ju1[i]==ru2[i]){//类型 可能不止占一节 
                count+=(ju1[i].size()+1);
            } 
            //不等时 
            else if(Check(ju1[i])==ru2[i])
            {
                Answer.push_back(ju1[i]);
                count+=1+ju1[i].size();
            }
            else if(ru2[i]=="<path>"){//非<path> 
                Answer.push_back(s.substr(count));//一直读到最后
            }//还不能判断是否可以,因为还有末尾的'/'
            else { 
                return false;    
            } 
        }
    }
//提取信息时,去掉了'/',所以判断时要注意末尾的'/'   很坑呐,因为末尾都可以是'/' 。坑啊啊啊啊!!
    if(s[s.size()-1]=='/'&&rules[rules.size()-1]!='/'){
        return false;
    }
    if(s[s.size()-1]!='/'&&rules[rules.size()-1]=='/'){
        return false;
    }
    //////////
    return true; //终极真!!! 
} 
int Str_to_Num(string str)//转换为整型,去掉前导零 
{
    int num=0;
    for(size_t i=0;i<str.size();i++)
    {
        num=num*10+(str[i]-'0');
    }
    return num;
}
int main()
{
    int n=0,m=0;
    cin>>n>>m;
    int i=0;
    for(i=0;i<n;i++)
    {
        cin>>Rules[i]>>Name[i];
    } 
    while(m--)
    {
        string s;
        cin>>s;
        bool flag=false;
        for(i=0;i<n;i++)
        {
            if(Judge(s,Rules[i])){
                flag=true;
                break;
            }
        }
        if(flag==false){
            cout<<"404"<<endl;
        }
        else{//true
            cout<<Name[i];
            for(size_t j=0;j<Answer.size();j++)
            {
                if(Check(Answer[j])=="<int>")
                {
                    cout<<' ';
                    cout<<Str_to_Num(Answer[j])<<' ';
                }
                else{
                    cout<<' '; 
                    cout<<Answer[j];
                }
            }
            cout<<endl;
        }
    }
    return 0;
} 
posted @ 2019-02-15 16:55  Bankarian  阅读(177)  评论(0编辑  收藏  举报