**
元素选择器
**
时间限制: 1.0s
内存限制: 256.0MB
题目背景
题目描述
输入格式
输出格式
样例输入
11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
p
#subtitle
h3
div p
div div p
样例输出
3 6 9 11
1 6
0
2 9 11
1 11
样例解释
数据规模和约定
提示
解题思路
数据范围不大,直接采用遍历的方法。将查询的语句按照空格拆分存进vector中,从上到下遍历存入的文档字符串,找到vector最后一元素对应的索引,如果是后代选择器,就从下向上遍历找到字符串相同并且满足包含关系的输入数据,存在就将前面找到的索引存入结果vector中,遍历完成输出每一次的vector结果即可。
注意标签要进行大小写的转换,并且判断过程中需要进行vector元素的删除,所以不能直接用一个全局变量,要进行传参。
C++代码
#include<iostream>
#include<vector>
using namespace std;
int n=0,m=0;
struct doc
{
string label;
string id;
int level;
};
vector<doc> d;
vector<string> search[15];
char change(char x)
{
if(x<='Z'&&x>='A')
{
return (char)(x+32);
}
else return x;
}
bool find(int index,vector<string> s)
{
int level=d[index].level;
s.pop_back();
if(s.size()==0) return true;
int judge=0;
for(int i=index-1;i>=0&&s.size()>0;i--)
{
if(d[i].label==s[s.size()-1]||d[i].id==s[s.size()-1])
{
if(d[i].level<level)
{
if(s.size()==1) judge=1;
level=d[i].level;
s.pop_back();
}
}
}
if(judge==0) return false;
else return true;
}
void getanswer(int x)
{
vector<int> ans;
for(int i=0;i<n;i++)
{
if(d[i].label==search[x][search[x].size()-1]||d[i].id==search[x][search[x].size()-1])
{
if(find(i,search[x])) ans.push_back(i+1);
}
}
cout<<ans.size();
for(int i=0;i<ans.size();i++) cout<<" "<<ans[i];
cout<<endl;
}
int main()
{
cin>>n>>m;
char cr=getchar();
for(int N=0;N<n;N++)
{
string str;
getline(cin,str);
int level=0,i=0;
string label="";
string id="";
doc dc;
for(i=0;i<str.length()&&str[i]!=' ';i++)
{
if(str[i]=='.') level++;
else label+=change(str[i]);
}
dc.label=label;
dc.level=level;
i++;
for(i;i<str.length();i++) id+=str[i];
dc.id=id;
d.push_back(dc);
}
for(int M=0;M<m;M++)
{
string str;
getline(cin,str);
string s="";
int judge=0;
for(int i=0;i<str.length();i++)
{
if(str[i]=='#')
{
judge=1;
s+=str[i];
}
else if(judge==0&&str[i]!=' ') s+=change(str[i]);
else if(judge==1&&str[i]!=' ') s+=str[i];
else
{
search[M].push_back(s);
s="";
judge==0;
}
}
if(!s.empty()) search[M].push_back(s);
getanswer(M);
}
return 0;
}