csp 201809-3 元素选择器

题目直达
一开始写了一份代码只有20分,苦思冥想原想很久也不知道哪里错了,后来发现是↓

cin>>   //会忽略换行符
getchar() //会读入换行符

这个知识点弄错了,第一行的内容少了一个字母。虽然能过了题目给的例子,但是最后gg
修改后的代码如下:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
struct node{
	string tap;
	string id;
	int pre;
};
node nodes[110];
int n,m;
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	char a;
	a=cin.get(); 
//原来这里写的是cin>>,后来为了禁用c语言兼容(后面超时了,想快点),把getchar()换了 
	string buff;
	for(int k=1;k<=n;k++){
		getline(cin,buff);
		int pre=0;
		for(int i=0;i<buff.size() ;i++){
			if(buff[i]=='.') pre++;
			else break;
		}
		string tap;
		int i=pre;
		for(;i<buff.size() ;i++){
			if(buff[i]==' ') break;
			if(buff[i]>='A'&&buff[i]<='Z'){
				tap+=buff[i]-'A'+'a';
			}
			else tap+=buff[i];
		}
		if(i==buff.size() ){
			nodes[k]=(node){tap,"",pre};
		}
		else{
			string id="";
			for(int j=i+2;j<buff.size() ;j++){
				id+=buff[j];
			}
			nodes[k]=(node){tap,'#'+id,pre};
		}
	}
	vector<string> search;
	for(int k=0;k<m;k++){
		search.clear() ;
		getline(cin,buff);
		string tmp="";
		bool flag=0;
		for(int i=0;i<buff.size() ;i++){
			if(buff[i]==' '){
				search.push_back(tmp);
				tmp.clear() ; 
				flag=0;
				continue;
			}
			else if(buff[i]=='#'){
				flag=1;
			}
			if(flag==0&&buff[i]>='A'&&buff[i]<='Z'){
				tmp+=buff[i]-'A'+'a';
			}
			else tmp+=buff[i];
			if(i==buff.size() -1) search.push_back(tmp); 
		}
		vector<int > ans;
		ans.clear() ;
		if(search.size() ==1){
			for(int i=1;i<=n;i++){
				if(nodes[i].id ==search[0]||nodes[i].tap ==search[0]){
					ans.push_back(i); 
				}
			}
		}
		else{
			int M=0;
			int level=1;
			int i=0;
			for(;i<search.size() -1;i++){
				while(1){
					if(nodes[level].id !=search[i]&&nodes[level].tap !=search[i]) level++;
					else {
						if(M<nodes[level].pre){
							M=nodes[level].pre;
							level++;
							break;	
						}
					}
				}
			}
			int size=search.size() ;
			if(i<size){
			for(;level<=n;level++){
				if(nodes[level].id==search[size-1]||nodes[level].tap ==search[size-1])
					ans.push_back(level); 
				}
			}
		}
		cout<<ans.size()<<" ";
		for(int i=0;i<ans.size() ;i++){
			cout<<ans[i]<<" ";
		}
		cout<<"\n";
	}
	return 0;
}

/*
11 5
html
..head
....title
..body
....h1
....p #substitle
....div #main
......h2
......p #one
......div
........p #two
p
#substitle
h3
div p
div div p


11 5
html
..head
....title
..body
....h1
....P #suBstitle
....div #main
......h2
......p #one
......div
........p #two
P
#two
h3
div p
div div #two
*/

上面的代码只有50分,现在还不清楚超时的原因,下面的代码是满分的:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
struct node{
	string tap;
	string id;
	int pre;
};
node nodes[110];
int n,m;
int main(){
	cin>>n>>m;
	char c;
	c=getchar();;
	string buff;
	for(int k=1;k<=n;k++){
		getline(cin,buff);
		int pre=0;
		for(int i=0;i<buff.size() ;i++){
			if(buff[i]=='.') pre++;
			else break;
		}
		string tap;
		int i=pre;
		for(;i<buff.size() ;i++){
			if(buff[i]==' ') break;
			if(buff[i]>='A'&&buff[i]<='Z'){
				tap+=buff[i]-'A'+'a';
			}
			else tap+=buff[i];
		}
		if(i==buff.size() ){
			nodes[k]=(node){tap,"",pre};
		}
		else{
			string id="";
			for(int j=i+2;j<buff.size() ;j++){
				id+=buff[j];
			}
			nodes[k]=(node){tap,'#'+id,pre};
		}
	}
	vector<string> search;
	for(int k=0;k<m;k++){
		while(!search.empty() ) search.pop_back() ;
		getline(cin,buff);
		string tmp="";
		bool flag=0;
		for(int i=0;i<buff.size() ;i++){
			if(buff[i]==' '){
				search.push_back(tmp);
				tmp.clear() ; 
				flag=0;
				continue;
			}
			else if(buff[i]=='#'){
				flag=1;
			}
			if(flag==0&&buff[i]>='A'&&buff[i]<='Z'){
				tmp+=buff[i]-'A'+'a';
			}
			else tmp+=buff[i];
			if(i==buff.size() -1) search.push_back(tmp); 
		}
		vector<int > ans;
		ans.clear() ;
		if(search.size() ==1){
			for(int i=1;i<=n;i++){
				if(nodes[i].id ==search[0]||nodes[i].tap ==search[0]){
					ans.push_back(i); 
				}
			}
		}
		else{
			int size=search.size() ;
			vector<int > p;
			vector<int> order;
			p.clear() ;
			order.clear() ;
			for(int i=1;i<=n;i++){
				if(nodes[i].id ==search[size-1]||nodes[i].tap ==search[size-1]){
					p.push_back(nodes[i].pre );
					order.push_back(i);  
				}
			}
			for(int i=0;i<p.size() ;i++){
				int s=0;
				for(int j=1;j<order[i];j++){
					if(nodes[j].pre<p[i]){
						if(search[s]==nodes[j].id ||search[s]==nodes[j].tap ){
							s++;
							if(s==size-1) break;
						}
					}
				}
				if(s==size-1) ans.push_back(order[i]); 
			}
		}
		cout<<ans.size()<<" ";
		for(int i=0;i<ans.size() ;i++){
			cout<<ans[i]<<" ";
		}
		cout<<"\n";
	}
	return 0;
}

下面是提交记录,我感觉第二版代码更容易超时,但是不知道为什么会这样。而且这个用时0ms也太迷了吧?
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值