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