CSP 201809-3 元素选择器

经典模拟题解析与注意事项
本文深入解析了一道经典模拟题的解题思路与代码实现,强调了读题细致、处理字符串大小写敏感性和避免索引冲突的重要性。通过具体代码示例,分享了在解决长模拟题时容易忽视的细节,如查询时对#号后字符的敏感处理及多层循环中索引的正确使用。

题目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结与思考

这一道经典模拟题,对于模拟题,尤其是长度较长的模拟题,一定要仔细读题,把每一个细节都照顾到,这个代码刚开始交了很多遍都是90,后来才发现题目中在查询的时候 #后面的字符大小心敏感,而我都按照不敏感处理;另外,由于代码中有较多的for循环,一定要注意内侧for循环的索引值不能与外侧索引值相同,容易发生一些奇怪的错误。

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,m;
char ch;
struct node{
	string label;
	string id;
	int l;
}a[109];
vector<string> demands;
void split_(string c,vector<string>&v)
{
	v.clear();
	int last=0;
	for(int t=0;t<c.length();t++)
	{
		if(c[t]==' ')
		{
			v.push_back(c.substr(last,t-last));
			last=t+1;
		}
	}
	v.push_back(c.substr(last,c.length()-last));
}
int main()
{
	freopen("a.txt","r",stdin);
	cin>>n>>m;
	getchar();
	for(int i=0;i<n;i++)
	{
		int tcnt=0;
		bool flag=false;
		while((ch=getchar())!='\n')
		{
			if(ch=='#'){
				string _tt;
				cin>>_tt;getchar();
				a[i].label=ch+_tt;
				break;
			}
			else if(ch=='.') tcnt++;
			else
			{
				a[i].id+=tolower(ch);
				while((ch=getchar())!=' ')
				{
					if(ch=='\n')
					{
						flag=true;
						break;
					}
					a[i].id+=tolower(ch);
				} 
			}
			if(flag) break;
		}
		a[i].l=tcnt/2; 
	}
			 
	for(int i=0;i<m;i++)
	{
		string com;
		vector<int> ans;
		getline(cin,com);
		split_(com,demands);
		for(int j=0;j<demands.size();j++)
		{
			if(demands[j][0]=='#') continue;
			for(int k=0;k<demands[j].length();k++)
			demands[j][k]=tolower(demands[j][k]);
		} 
		if(demands.size()==1)
	  	{
	   		for(int k=0;k<n;k++)
	   		{
	    			if(a[k].id==demands[0] || a[k].label==demands[0])
	     				ans.push_back(k);
	   		}
	  	}
	  	else
	  	{
	   		for(int k=0;k<n;k++)
	  	 	{
	    			int len=demands.size()-1;
	    			if(a[k].label==demands[len] || a[k].id==demands[len])
	    			{
	     				len--;
	     				for(int j=k-1;j>=0&&a[j].l<=a[k].l;j--)
	     				{
		      				if(a[j].l<a[k].l)
		      				{
		       					if(a[j].label==demands[len] || a[j].id==demands[len])
		       					{
		        					len--;
		        					if(len==-1) break;
		       					}
		      				}
		     			}
	    			}
	    		if(len==-1) ans.push_back(k);
	   		}
	  	}	
	  	cout<<ans.size()<<" ";
		for(int y=0;y<ans.size();y++) cout<<ans[y]+1<<" ";
		cout<<endl; 
	 }
	 return 0;
} 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值