Skip to content

Pro3_WA_90

原始文件为 CPP 代码,本文是转换后的 Markdown 文件。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <sstream>

using namespace std;

const int maxn = 105;

map<string,int> element_order;
string element_vector[2][maxn];
vector<int> element_line[2*maxn]; 
int parent[maxn];
int depth[maxn];

void readline(string str,int lineorder,int& order)
{
    int pos = 0;
    while(str[pos++] == '.');
    depth[lineorder] = pos/2;

    if (lineorder > 0)
    {
        int parentorder = lineorder - 1;
        while (depth[parentorder] != depth[lineorder]-1)
        {
            parentorder = parent[parentorder];
        }
        parent[lineorder] = parentorder;
    }

    str = str.substr(pos-1,str.size());
    stringstream ss(str);
    string item;
    element_vector[1][lineorder] = "";

    int choice = 0;
    while(getline(ss,item,' '))
    {   
        element_vector[choice++][lineorder] = item;
        if (!element_order.count(item) > 0)
        {
            element_order.insert(make_pair(item,order));    
            element_line[order].push_back(lineorder);
            order++;
        }else
        {
            int temp = element_order[item];
            element_line[temp].push_back(lineorder);
        }
    }                   
}

void searchline(string line)
{
    vector<string> itemvector;
    vector<int> ans;
    stringstream ss(line);
    string item;

    while(getline(ss,item,' '))
        itemvector.push_back(item);

    string str = itemvector[itemvector.size()-1];   
    if (!element_order.count(str) > 0)
    {
        cout << "0" << endl;
        return;
    }
    int order = element_order[str];
    int size = element_line[order].size();

    for (int i = 0; i < size; ++i)
    {
        int curnode = element_line[order][i];
        int parentnode = curnode;
        int itemnode = itemvector.size()-2;

        bool flag = true;
        while(itemnode >= 0)
        {
            string nowstr = itemvector[itemnode--];
            int choice = (nowstr[0]=='#') ? 1 : 0;

            do
            {
                parentnode = parent[parentnode];

                if (parentnode == -1)
                {
                    flag = false;
                    goto check;
                }
            }while(element_vector[choice][parentnode] != nowstr);

        }

        check:
        if (flag) ans.push_back(curnode+1); 
    }

    int ansnum = ans.size();
    printf("%d",ansnum);
    for (auto& i : ans) printf(" %d",i);
    printf("\n");
}

int main()
{
    parent[0] = -1;
    freopen("in.txt","r",stdin);
    int n,m;
    scanf("%d%d",&n,&m);
    cin.get();

    string line;
    int order = 0;
    for (int i = 0; i < n; ++i)
    {
        getline(cin,line);
        readline(line,i,order);
    }

    for (int i = 0; i < m; ++i)
    {
        getline(cin,line);
        searchline(line);
    }
}