csp 201809-3 元素选择器

题目

元素选择器

题目大意

本题给出了一种目录结构,每个目录包含了两个属性,分别是label和id。另外每个目录有一定级层,可以用之前的省略号数目来表示层级。题目会给出三种寻找方式,要求我们找到满足条件的目录数目及其编号。三种方式分别是label寻找和id寻找和后代选择器,其中后代选择器给出了要求寻找的层级之上的一些约束。

解题思路

本题思路较为简单,首先用结构体来存储每个目录,其中存储了label和id以及层级数,另外还需要一个二维数组数组,key[i]存储第i层级所有目录编号。对于前两种查找只要对号放入答案数组即可,对于后代选择器,需要查找对应目录之上层级中是否包括后代选择器中对应的内容,这里只需要遍历key的各层寻找即可,总体来说思路比较简单。

具体代码

#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<map>
#define MAXN 100005
#define ll long long

using namespace std;

struct node{
	int grade;
	string label;
	string id; 
}s[101];

vector<int> key[101];
vector<int> ans[101];

bool same(string a,string b)//两个标签是否相等(大小写不敏感) 
{
	if(a.length()!=b.length()) return false;
	for(int i=0;i<a.length();i++)
	if(a[i]==b[i]) continue;
	else if(a[i]==b[i]+'A'-'a') continue;
	else if(b[i]==a[i]+'A'-'a') continue;
	else return false;
	return true;
}
int main()
{
	memset(key,0,sizeof(key));
	memset(ans,0,sizeof(ans));
	int n,m;
	cin>>n>>m;
	getchar();
	for(int i=1;i<=n;i++)
	{
		string str;
		getline(cin,str);
		
		int num=str.find('.');
		while(str[num]=='.'||num==-1) num++;
		s[i].grade = num/2;
		key[s[i].grade].push_back(i);
		
		if(str.find('#')!=-1)
		{
			s[i].id=str.substr(str.find('#'));
			s[i].label=str.substr(num,str.find('#')-num-1);
		}
		else
		{
			s[i].id="";
			s[i].label=str.substr(num);
		} 
	} 
	
	
	for(int i=1;i<=m;i++)
	{
		string tmp;
		getline(cin,tmp);
		if(tmp.find('#')==-1&&tmp.find(' ')==-1)
		{
			for(int j=1;j<=n;j++)
				if(same(tmp,s[j].label))
				    ans[i].push_back(j);
		}
		
		else if(tmp.find('#')!=-1&&tmp.find(' ')==-1)
		{
		    for(int j=1;j<=n;j++)
			if(tmp==s[j].id)
				ans[i].push_back(j);
		} 
		
		else //后代选择器 
		{
			string str;
			for(int j=1;j<=n;j++)
			{ 
			    stringstream ss(tmp);
			    stack<string> temp;
			    int cnt=0;
			    while(ss>>str)
			    { 
			        temp.push(str);
			        cnt++;
			    }
			    str=temp.top();temp.pop();
				if(str.find('#')==-1&&!same(str,s[j].label)) continue;
				else if(str.find('#')!=-1&&str!=s[j].id) continue;
				int sum=0;
				for(int p=s[j].grade-1;p>=0;p--)
				{
					str=temp.top();
					if(str.find('#')==-1)
					{
						for(int q=0;q<key[p].size();q++)
						{
						    if(same(str,s[key[p][q]].label)) 
						    {
							    sum++;
								temp.pop();
								break;
							}	
						}
					}
					else
					{
						for(int q=0;q<key[p].size();q++)
						{ 
							if(str==s[key[p][q]].id) 
						    {
							    sum++;
								temp.pop();
								break;
							}
						}
					}   
					if(sum==cnt-1) 
					{
						ans[i].push_back(j);
						break;
					}
				}
			}
		}
	}
	for(int i = 1; i <= m; i++)
	{
		cout << ans[i].size() << " ";
		for(int j = 0; j < ans[i].size(); j++)
		{
			cout << ans[i][j] << " ";
		}
		cout << endl;
	}
}

原创文章 46 获赞 1 访问量 1495

猜你喜欢

转载自blog.csdn.net/weixin_43676449/article/details/105709810