CCF认证 201809-3元素选择器
#include<bits/stdc++.h>
using namespace std;
struct node{
int rank;//.的个数
string p="";//标签
string id="";//id属性
node(int r,string pp,string idd)
{
rank=r;
p=pp;
id=idd;
}
};
vector<node>vc;
void tostr(string &str)
{
for(int i=0;i<str.size();i++)
{
str[i]=tolower(str[i]);
}
}
bool search(vector<node> &vc,int &end,int &rank,string s)
{
for(int j=end;j>=0;j--)
{
if(vc[j].rank<rank&&(vc[j].p==s||vc[j].id==s))
{
rank=vc[j].rank;
end=j;
return true;
}
}
return false;
}
int main()
{
int n,m;
cin>>n>>m;
string ss;
getchar();
for(int i=0;i<n;i++)
{
getline(cin,ss);
int num=0;//用来标记其等级..
int pos=-1;//用来标记#的位置
string pp="",idd="";
for(int j=0;j<ss.size();j++)
{
if(ss[j]=='.')
{
num++;
continue;
}
if(ss[j]=='#')
{
pos=j;
break;
}
}
if(pos!=-1)
{
pp=ss.substr(num,pos-num-1);
tostr(pp);
idd=ss.substr(pos);
}
else
{
pp=ss.substr(num);
tostr(pp);
}
//cout<<"pp="<<pp<<"idd="<<idd<<endl;
vc.push_back({num,pp,idd});
}
string ch;
for(int i=0;i<m;i++)
{
getline(cin,ch);
stringstream all;
all<<ch;
string x;
vector<string>tr;//存储查询的标记元素
vector<int>in;//存储符合的位置
while(all>>x)
{
if(x[i]!='#')
{
tostr(x);
}
tr.push_back(x);//分割为多个子字符串
}
for(int i=0;i<vc.size();i++)
{
int len=tr.size()-1;
if(vc[i].id==tr[len]||vc[i].p==tr[len])
{
int end=i;
int k=len-1;
int rank=vc[i].rank;
for(;k>=0;k--)
{
if(!search(vc,end,rank,tr[k])) break;
}
if(k<0)
{
in.push_back(i);
}
}
}
cout<<in.size();
for(int i=0;i<in.size();i++)
{
cout<<" "<<in[i]+1;
}
in.clear();
cout<<endl;
}
cout<<endl;
return 0;
}