CCF 2018-9-3 元素选择器 100分

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

 

#include<iostream>
#include<vector>
using namespace std;

string str[105],s;
int dotNum[105]={0};
int n,m;

int deal(vector<string> find){
	vector<int> flag;flag.push_back(-1);//flag数组记录每次找到匹配项时所在的层次,即小数点数 
	vector<int> res;
	int x=0;
	for(int i=0;i<n;i++){
		if(dotNum[i]<=flag[flag.size()-1]){//若当前的层数小于我要找的最小层数,则find与flag各退一层 
			x--;if(x<0)x=0;
			flag.erase(flag.end()-1);
		}else{//若当前查找的层数满足要求 
			string temp=str[i];string fx=find[x];//从temp中找fx 
			int index=temp.find(fx);//若能找到,再分析找到的位置是否合法 
			if(index<temp.size() && (index==0 || temp[index-1]==' ' || temp[index-1]=='.')){
				flag.push_back(dotNum[i]);//都合法,则说明又找到一层 此时把层数计入flag,再把find指向下一个查找项 
				x++;
				if(x>=find.size()){//若要查找的数到头了,则找完了 
					res.push_back(i+1);//找完了则应该再退一个,看看该层中是否还有别的满足要求的 
					x--;
					if(flag.size()>1)flag.erase(flag.end()-1);
				}
			}
		}
	}
	cout<<res.size();
	for(int i=0;i<res.size();i++){
		cout<<" "<<res[i];
	}
	cout<<endl;
}

int main(){
	cin>>n>>m;
	getline(cin,s);
	for(int i=0,j,k;i<n;i++){
		getline(cin,s);
		for(j=0;j<s.size();j++){
			if(s[j]!='.'){
				dotNum[i]=j;
				break;
			}
		}
		for(k=j;k<s.size();k++){//输入正文后,修改大小写 
			if(s[k]>='A' && s[k]<='Z')s[k]+=32;
			if(s[k]=='#')break;
		}
		str[i]=s;
	}
	
	while(m--){
		vector<string> find;
		getline(cin,s);
		for(int k=0;k<s.size();k++){//第一次扫描要查找的内容,修改大小写 
			if(s[k]=='#'){
				while(1){
					if(k>=s.size())break;
					if(s[k]==' ')break;
					k++;
				}
			}
			if(s[k]>='A' && s[k]<='Z')s[k]+=32;
		}
		int a=0,b=0;
		while(b<s.size()){//第二次扫描,根据空格将字符分解,装入数组 
			while(1){
			    if(b>=s.size())break;
			    if(s[b]==' ')break;
			    b++;
		    } 
		    find.push_back(s.substr(a,b-a)); 
		    b++;a=b;
		}
		deal(find);//将拆分后的数组与模板进行对比查找 
	}
} 

更多相关CCF的试题解答,请点击>>CCF历年认证考试解答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值