题意
思路:
用point来存储结构化文档,里面string label,string id为标签和id,int c为所在层数,两个点就为一层。
读入结构化文档:用getline读入一行,然后计算出点的个数,层数就为点的个数除以2。接下来读入label,因为label大小写不敏感,将其全部转换为小写。如果字符串还有剩余,则读入id。
接下来读入查询信息,然后进行处理,按空格把字符串分开,放在vector v里。然后将v中的所有标签(不以#开头)转换为小写。再从后往前遍历结构化文档,找到匹配最后一个查询的元素,然后寻找其祖先,如果祖先全部匹配,则该元素符合条件,加入到vector ans中。
因为答案是从后往前放入ans的,所以输出时要倒序输出vector ans。
总结:
一道稍微复杂一点的模拟题,因为n范围很小所以不用考虑是否要用复杂度较低的写法。同时写过前端的人可以很好的理解题目。
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int n,m;
struct point
{
string label,id; //标签和id
int c; //层数
point() { }
} node[110];
vector<string> v; //存放查询
vector<int> ans; //存放答案
bool solve(int &index,int &c,int vv) //从node[index]开始查询,层数为c标签/id为v[vv]
{
//看祖先是否匹配
for(int i=index; i>=1; i--)
{
if(node[i].c<c) //进入上一层
{
c=node[i].c;
index=i;
if(node[i].id==v[vv]||node[i].label==v[vv])
return true;
}
}
return false;
}
int main()
{
cin>>n>>m;
getchar(); //吃一个回车
for(int i=1; i<=n; i++) //处理结构化文档
{
string s;
getline(cin,s);
int index=0;
//记录.的个数
while(s[index]=='.')
index++;
node[i].c=index/2; //层数为.的个数/2
//读入label
string label;
while(s[index]!=' '&&index<s.size())
label=label+s[index],index++;
//label大小写不敏感,将其转换为小写
for(int j=0; j<label.size(); j++)
if(label[j]>='A'&&label[j]<='Z')
label[j]=label[j]-'A'+'a';
node[i].label=label;
//读入id
if(index<s.size())
{
string id;
index++; //加之前是空格
while(index<s.size())
id=id+s[index],index++;
node[i].id=id;
}
}
for(int i=1; i<=m; i++) //读入查询
{
string s;
getline(cin,s);
v.clear();
ans.clear();
//对s进行处理,按空格分开字符串
int index=0;
while(index<s.size())
{
string s1;
while(index<s.size()&&s[index]!=' ')
s1=s1+s[index],index++;
v.push_back(s1);
if(index<s.size()&&s[index]==' ')
index++;
}
//将标签变为小写
for(int j=0; j<v.size(); j++)
if(v[j][0]!='#')
for(int k=0; k<v[j].size(); k++)
if(v[j][k]>='A'&&v[j][k]<='Z')
v[j][k]=v[j][k]-'A'+'a';
//从后往前遍历,找到匹配最后一个查询的元素
//然后寻找其祖先,如果祖先全匹配,则该元素符合条件
for(int j=n; j>=1; j--)
{
if(node[j].id==v[v.size()-1]||node[j].label==v[v.size()-1]) //匹配
{
//看祖先是否全部匹配
int idx=j,c=node[j].c,vv=v.size()-2;
while(vv>=0)
{
if(!solve(idx,c,vv))
break;
vv--;
}
if(vv==-1)
ans.push_back(j);
}
}
cout<<ans.size();
for(int j=ans.size()-1; j>=0; j--)
cout<<" "<<ans[j];
cout<<endl;
}
}