CCF认证 201809-3元素选择器

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;
}