CSP认证考试:
201809-3 元素选择器
虽然自己测试的时候都是对的,但只能得标签的四十分,带id和后代选择器的都错了,实在不能理解。
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{
string name;
string id;
int line;
int level;
vector<node*>son;
node *mother;
};
vector<vector<int>> ans;
//
string lower(string a){
int length=a.size();
for(int i=0;i<length;i++){
if(a[i]>='A' && a[i]<='Z'){
a[i]=a[i]+'a'-'A';
}
}
return a;
}
//
int cmp(int a,int b){
return a<b;
}
//
void find(vector<int>&ans2,node* head,vector<string>&S,int now){
int length=head->son.size();
for(int i=0;i<length;i++){
if( lower(head->son[i]->name)==lower(S[now]) ) {
if(now==S.size()-1) ans2.push_back( head->son[i]->line );
else find(ans2,head->son[i],S,now+1);
}
else if( head->son[i]->id==S[now] ){
if(now==S.size()-1) ans2.push_back( head->son[i]->line );
else find(ans2,head->son[i],S,now+1);
}
else{
find(ans2,head->son[i],S,now);
}
}
}
//
int main(){
cin>>n>>m;
getchar();
node* head=new node; head->name="原初";
node* pre=new node;
node* last_line=new node;//上一行
//
for(int i=0;i<n;i++){
string str;
getline(cin,str);
//读入了一句html
int level=0;
while(str[0]=='.') {
level++;
str.erase(str.begin());
}
level=level/2+1;
//知道了分级是多少
node* temp=new node;
temp->level=level;
if(level==1){//等级为1,开启新的族谱
temp->mother=head;
head->son.push_back(temp);
last_line=temp;
}
else if(last_line->level==level){
temp->mother=last_line->mother;
temp->mother ->son.push_back(temp);
last_line=temp;
}
else if(last_line->level+1==level){
temp->mother=last_line;
temp->mother ->son.push_back(temp);
last_line=temp;
}
else if(last_line->level > level){
while(last_line->level >= level){
last_line=last_line->mother;
}
last_line->son.push_back(temp);
last_line=temp;
}
//确定该行的母亲,母亲认子
temp->line=i;
int flag=0;
for(int j=0;j<str.size();j++){
if(str[j]==' '){
flag=1;
continue;
}
if(flag==0) {
temp->name.push_back(str[j]);
}
else temp->id.push_back(str[j]);
}
//读入内容,都有name,但不一定有id
}
//数据储存完成,分级完成,母子确认完成
for(int i=0;i<m;i++){
vector<string> S;
string str;
getline(cin,str);
string con;
for(int j=0;j<str.size();j++){
if(str[j]==' '){
S.push_back(con);
con.clear();
continue;
}
con.push_back(str[j]);
}
S.push_back(con);
//
vector<int> ans2;
find(ans2,head,S,0);
ans.push_back(ans2);
}
//
for(int i=0;i<ans.size();i++){
sort(ans[i].begin(),ans[i].end(),cmp);
cout<<ans[i].size();
for(int j=0;j<ans[i].size();j++){
cout<<" "<<ans[i][j]+1;
}
if(i!=ans.size()-1)cout<<"\n";
}
return 0;
}