CCF201809-3 元素选择器

试题编号: 201809-3
试题名称: 元素选择器
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

CCF201809-3 元素选择器_第1张图片
CCF201809-3 元素选择器_第2张图片
CCF201809-3 元素选择器_第3张图片
CCF201809-3 元素选择器_第4张图片

 

版本一(时间:2018.10.23)(推荐版本二)

 

分析

大模拟,与往年相比这道题难度有所下降,比较好懂,但要注意一个细节就是一个元素的祖先是紧接着其上的缩进小于等于其缩进的那些元素(连续的区域)中的缩进小于其缩进的元素(没有等于的元素,等于的元素只是起一种连接作用),具体看程序

 

C++程序

#include
#include
#include
#include
#include
#include
 
using namespace std;
 
const int N=105;
 
struct Node{
	string lable,id;
	int d;//缩进 
}a[N];
 
vectordemand;
mapan,query;//an表示各个祖先含有的标签,id属性等,query表示要查询的 

//将字符串s化为小写串 
string mystrlwr(string s)
{
	for(int i=0;i&v)
{
	v.clear();
	char *p=strtok(s," ");
	while(p){
		v.push_back(p);
		p=strtok(NULL," "); 
	}
}
 
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	getchar();//读取回车 
	for(int i=1;i<=n;i++){
		string s;
		getline(cin,s);
		//统计缩进
		int cnt=0;
		for(int j=0;jans;
		if(demand.size()==1){//不是后代选择器,直接进行匹配 
			string q=demand[0];
			if(q[0]!='#')//查询标签大小写不敏感
			  q=mystrlwr(q);//化为小写  
			//进行匹配
			for(int i=1;i<=n;i++)
			  if(q==a[i].lable||q==a[i].id)
			    ans.push_back(i); //保存行号 
		}
		else{
			query.clear();
			for(int i=0;i0&&a[j].d<=a[i].d;j--){
                    if(a[j].d==a[i].d)continue;//关键:细节
				  	an[a[j].lable]++;//由于标签不会为空,因此直接加一 
				  	if(a[j].id!="")//只将不为空的id进行加一 
				  	  an[a[j].id]++;
				  }
				//判断是否符合条件
				bool flag=true;
				//遍历查询的所有id选择器和标签选择器 
				for(map::iterator it=query.begin();it!=query.end();it++)
				  if(an.count(it->first)==0||an[it->first]second){//如果i的祖先没有或者有但是个数不够 
				  	flag=false;
				  	break;
				  }
				if(flag)
				  ans.push_back(i); 
			  }
		}
		printf("%d",ans.size());
		for(int i=0;i

 

版本二(时间:2019.03.07

 

分析

解决评论区的问题,具体看程序

C++程序

#include
#include
#include
#include
 
using namespace std;
 
const int N=105;
 
struct Node{
	string lable,id;//标签和属性 
	int cnt;//缩进 
}a[N];
 
//将字符串化成小写 
void mystrlwr(string &s)
{
	for(int i=0;i=1;i--)//遍历 
	{
		if(a[i].cnt>n>>m;//读入n和m 
	getchar();//读取换行符 
	for(int i=1;i<=n;i++)
	{
		getline(cin,s);
		//pos1记录标签的起始位置,pos2记录id属性的起始位置,cnt记录缩进 
		int pos1=-1,pos2=-1,cnt=0; 
		for(int j=0;jquery;//存储查询 
		vectorans;//存储结果 
		gets(tmp);//读入 
		char *sp=strtok(tmp," ");//将插叙用空格分割,按序存放在query向量中 
		while(sp)
		{
			query.push_back(sp);
			sp=strtok(NULL," ");
		}
		int len=query.size();
		for(int j=0;j=0;k--)
				{
					if(!search(a,start,cnt,query[k])) break;
				}
				if(k<0)//成功
				  ans.push_back(j); 
			}
		}
		//输出结果 
		cout<

 

你可能感兴趣的:(ACM__模拟,CCF,CSP,认证考试)