思路:
输入n个目录和m个需要查询的目录。定义一个结构体进行存储。在查询子目录时,定义两个容器,一个来存储最后的答案,另一个容器来存储字符串,如果查询的目录存在就输出答案,否则输出0.因为查找时有大小写,在进行存储和查找时都将大写变成小写。
代码:
#include<iostream>
#include<sstream>
#include<vector>
#include<string>
using namespace std;
struct node{
int father;
int cnt;
string label;
string id;
}temp[105];
vector<int> ans;
vector<string> cm;
int n,m;
void f(int am,int bm,node dm)
{
if(am==cm.size())
{
ans.push_back(bm);
return;
}
if(dm.father==-1) return;
string s=cm[cm.size()-1-am];
if(dm.label==s||dm.id==s) f(am+1,bm,temp[dm.father]);
}
int main()
{
cin>>n>>m;
getchar();
string st;
for(int i=0;i<n;i++)
{
int ui=0;
stringstream ss;
ss.clear();
getline(cin,st);
while(st[ui]=='.') ui++;
ss.str(st.substr(ui));
ss>>temp[i].label>>temp[i].id;
for(int j=i-1;j>=1;j--)
{
if(temp[j].cnt==ui/2-1)
{
temp[i].father=j;
break;
}
}
temp[i].cnt=ui/2;
string rt=temp[i].label;
for(int j=0;j<rt.length();j++) rt[j]=tolower(rt[j]);
}
for(int i=0;i<m;i++)
{
ans.clear();
cm.clear();
string io;
stringstream ss;
getline(cin,st);
ss.str(st);
while(ss>>io)
{
if(io!="")
cm.push_back(io);
}
for(int j=0;j<cm.size();j++)
{
if(cm[j][0]!='#')
{
string rt=cm[j];
for(int k=0;k<rt.length();k++) rt[j]=tolower(rt[k]);
}
}
for(int j=0;j<=n;j++) f(0,j,temp[j]);
cout<<ans.size();
for(int j=0;j<ans.size();j++) cout<<" "<<ans[j];
cout<<endl;
}
return 0;
}