题目:http://118.190.20.162/view.page?gpid=T77
测试用例:
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
结果:
思路:
将每一行作为一个结构体,分为label,id,level。level=点数/2.
利用stringstream将要查询字符串分成独立的个体,存在vector中,从vector中最后一个元素,结构数组e[]的第一个位置,开始查找。找到所有的匹配项后,将位置插入ans数组。
如果上面的看不懂可以参考https://blog.csdn.net/leelitian3/article/details/82776210
满分代码:
#include<bits/stdc++.h>
using namespace std;
struct Node{
string label;
string id;
int level;
}e[105];
vector<string> s;//selectors
vector<int> ans;
void lowen(string &ss){
for(int i=0;i<ss.size();i++){
if(isalpha(ss[i]))
ss[i]=tolower(ss[i]);
}
}
void insert(string ss,int x){
int flag=0;
int s1,s2,level;
string label;
for(int i=0;i<ss.size();i++){
if(ss[i]=='.')
level++;
else if(ss[i]!='.'&&flag==0){
flag=1;
s1=i;
}
else if(ss[i]==' '&&flag==1){
flag=2;
s2=i+1;
break;
}
}
e[x].level=level/2;
if(flag!=2){
label=ss.substr(s1);
lowen(label);
e[x].label=label;
}
else if(flag==2){
label=ss.substr(s1,s2-1-s1);
lowen(label);
e[x].label=label;
e[x].id=ss.substr(s2);
}
}
bool match(int x){
int l=e[x].level,ind=s.size()-2;
for(int i=x-1;i>=0;i--){
if(e[i].level==l-1){
if(s[ind][0]!='#'&&s[ind]==e[i].label){
ind--;
}else if(s[ind][0]=='#'&&s[ind]==e[i].id){
ind--;
}
l=e[i].level;
if(ind<0)
return true;
}
}
return false;
}
int main(){
int n,m;
string line;
cin>>n>>m;
getchar();
for(int i=0;i<n;i++){
getline(cin,line);
insert(line,i);
}
for(int i=0;i<m;i++){
getline(cin,line);
stringstream ss;
ss<<line;
string t;
while(ss>>t){
if(t[0]!='#')
lowen(t);
s.push_back(t);
}
int ssize=s.size();
for(int j=0;j<n;j++){
if((s[ssize-1][0]=='#'&&s[ssize-1]==e[j].id)
||(s[ssize-1][0]!='#'&&s[ssize-1]==e[j].label)){
if(ssize==1){
ans.push_back(j+1);
//cout<<ans[ans.size()-1]<<endl;
}
else if(match(j))
{
ans.push_back(j+1);
}
}
}
cout<<ans.size();
for(int j=0;j<ans.size();j++){
cout<<" "<<ans[j];
}
cout<<endl;
s.clear();
ans.clear();
}
return 0;
}