具體細節在代碼中。
#include<iostream>
#include<string.h>
#include<string>
#include<sstream>
#include<vector>
#include<stack>
using namespace std;
struct node{
string name,tag;
int level;
node* parent;
node(string n,string t,int l)
{
name=n,tag=t,level=l;
parent=NULL;
}
};
void split(string& str,vector<string>& s)//把查詢選擇器拆分
{
s.clear();
string tmp;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ')//遇到空格說明一部分結束
{
s.push_back(tmp);
tmp.clear();
}
else
tmp+=str[i];
}
s.push_back(tmp);//把最後一部分也放入
}
bool judge(node* t,string s)
{
if(s[0]=='#')
return s==t->tag;
if(s.size()!=t->name.size())
return false;
for(int i=0;i<s.size();i++)
{
if(tolower(s[i])!=tolower(t->name[i]))
return false;
}
return true;
}
int main()
{
int n,m;
cin>>n>>m;
vector<node*> nodes;
stack<node*> parents;
string str;
getline(cin,str);
for(int cnt=0;cnt<n;cnt++)
{
getline(cin,str);
int level=0;
while(str[level]=='.')
level++;
stringstream ss(str.substr(level));//把'.'忽略掉
string name,tag;
ss>>name>>tag;
node* now=new node(name,tag,level);
//找出父元素
if(!parents.empty())
{
node* p;
while(p=parents.top(),p->level>=level)//level小於等於當前點的level的,都不是父元素
{
parents.pop();//去掉
}
now->parent=p;
}
parents.push(now);
nodes.push_back(now);
}
vector<int> ans;
vector<string> sel;
while(m--)
{
getline(cin,str);
split(str,sel);
ans.clear();
for(int i=0;i<nodes.size();i++)
{
int sl=sel.size()-1;
if(judge(nodes[i],sel[sl]))
{
node* t=nodes[i]->parent;
sl--;
while(t&&sl>=0)
{
if(judge(t,sel[sl])) sl--;
t=t->parent;
}
if(sl==-1) ans.push_back(i+1);
}
}
printf("%d ",ans.size());
for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);
if(m!=0) printf("\n");
}
}