美文网首页
ccf 201809-3 元素选择器

ccf 201809-3 元素选择器

作者: yestinl | 来源:发表于2018-12-15 16:16 被阅读0次
    image.png

    代码

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <sstream>
    #include <queue>
    using namespace std;
    
    struct node{
        int parent;
        int level;
        string id;
        string e;
    };
    
    node vec[110];
    vector<int> parent[110];
    vector<string> searVec;
    queue<int> ans;
    bool flag;
    int num = 0;
    
    void dfs(int len, int pos)
    {
        if(len==0)
        {
            num++;
            return;
        }
        if(vec[vec[pos].parent].id == searVec[len] || vec[vec[pos].parent].e == searVec[len] )
            dfs(len-1, vec[pos].parent);
    }
    
    string tolow(string s)
    {
        for(int i=0; i<s.length(); i++)
        {
            s[i] = tolower(s[i]);
        }
        return s;
    }
    
    int main()
    {
        int n, m;
        cin >> n >> m;
        string root;
        cin >> root;
        vec[0].e = root;
        vec[0].parent = -1;
        vec[0].level = 0;
        vec[0].id = ' ';
        parent[0].push_back(0);
        getchar();
        for(int i=1; i<n; i++)
        {
            string strData;
            int dotCount;
            int idPos;
            getline(cin, strData);
            dotCount = strData.rfind('.')+1;
            idPos = strData.find('#');
            vec[i].level = dotCount/2;
            parent[dotCount/2].push_back(i);
            vec[i].parent = parent[dotCount/2-1].back();
            if(idPos == -1)
            {
                vec[i].e = strData.substr(dotCount);
                vec[i].e = tolow(vec[i].e);
                vec[i].id = ' ';
            }
            else
            {
                vec[i].e = strData.substr(dotCount, idPos-dotCount-1);
                vec[i].e = tolow(vec[i].e);
                vec[i].id = strData.substr(idPos);
            }
        }
    //    for(int i=0; i<n; i++)
    //        cout << vec[i].e << " " << vec[i].id << " " << vec[i].level << " " << vec[i].parent<<endl;
        while(m--)
        {
            num = 0;
            searVec.clear();
            int len;
            string strOption;
            string strT;
            getline(cin, strOption);
            stringstream ss(strOption);
            while(ss >> strT)
            {
                if(strT[0]!='#')
                    strT = tolow(strT);
                searVec.push_back(strT);
            }
            len = searVec.size();
            if(len == 1)
            {
                for(int i=0; i<n; i++)
                {
                    if(vec[i].e == searVec[len-1] || vec[i].id == searVec[len-1])
                    {
                        num++;
                        ans.push(i+1);
                    }
                }
            }
            else
            {
                for(int i=0; i<n; i++)
                {
                    len = searVec.size()-1;
                    if(vec[i].id == searVec[len] || vec[i].e == searVec[len])
                    {
                        for(int j=i-1; j>=0&&vec[j].level<=vec[i].level; j--) //这里一定是j>=0
                        {
                            if(vec[j].level<vec[i].level)
                            {
                                if(vec[j].id == searVec[len-1] || vec[j].e == searVec[len-1])
                                {
                                    len--;
                                    if(len==0)
                                        break;
                                }
                            }
                        }
                    }
                    if(len==0)
                    {
                        ans.push(i+1);
                        num++;
                    }
                }
            }
            cout << num;
            while(!ans.empty())
            {
                cout << " " << ans.front();
                ans.pop();
            }
            cout << endl;
        }
        return 0;
    }
    

    总结

    1. 这是一道考试时候没写出来的题目,有点难过。
    2. 属于模拟题,主要是考查了字符串的匹配、截取的一些操作,熟悉 find, rfind, stringstream, substr等字符串操作
    3. 熟悉getline函数,注意getline使用前用getchar对cin的换行符处理
    4. 熟悉tolower函数
    5. 使用dfs发生运行错误,未找到原因

    相关文章

      网友评论

          本文标题:ccf 201809-3 元素选择器

          本文链接:https://www.haomeiwen.com/subject/rdyahqtx.html