csp 元素選擇器

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

具體細節在代碼中。

#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");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章