点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cstring>
using namespace std;
typedef pair<string,int> P;
map<P,vector<int> > G;//存储<<标签或ID,深度>,存在的行>
map<P,vector<int> >::iterator it;
int max_dp,n,m;
void toLower(string& s){for(int i=0,ni=s.size();i<ni;++i)s[i]=tolower(s[i]);}
void find(int vi,int dp,set<int>&s,const vector<string>&v,const int& N){//查询在v中的第vi个字符串
if(dp>max_dp||vi>N) return;//如果大于深度或者查询结束
if((it=G.find(P(v[vi],dp)))!=G.end()){//如果在dp深度查询到第vi个字符串
if(vi==N)
s.insert(it->second.begin(),it->second.end());//如果查询结束
else
find(vi+1,dp+2,s,v,N);//否则查询下一深度的下一个查询
}
find(vi,dp+2,s,v,N);//不管如何都要查询下一深度
}
int main(){
string s;
cin>>n>>m,cin.get(),max_dp=0;
for(int i=0,j,nj,l;i<n;++i){//处理文档
getline(cin,s),j=0,nj=s.size();
while(j<nj&&s[j]=='.')++j;
l=j;
while(j<nj&&s[j]!=' ')++j;
string label=s.substr(l,j-l);
max_dp=max(max_dp,l),toLower(label);
G[P(label,l)].emplace_back(i+1);//这是标签
while(j<nj&&s[j]==' ')++j;
if(j==nj)continue;
G[P(s.substr(j,nj-j),l)].emplace_back(i+1);//这是ID
}
for(int i=0;i<m;++i){//处理查询
getline(cin,s);
int j=0,nj=s.size(),l;
vector<string>V;//要查询的标签和ID
set<int>S;//存储查询到的结果
while(j<nj){//循环处理深度
l=j;
while(j<nj&&s[j]!=' ')++j;
string s1=s.substr(l,j-l);
if(s1[0]!='#')toLower(s1);//如果不是ID那么都处理成小写
V.emplace_back(s1);
while(j<nj&&s[j]==' ')++j;
}
find(0,0,S,V,V.size()-1);//查询
cout<<S.size();//以下为输出
for(set<int>::iterator it=S.begin();it!=S.end();++it) cout<<" "<<(*it);
cout<<endl;
}
return 0;
}