CSP-20180903

CSP-20180903

把之前写的题目整理了一下,不知道CSDN有没有再编辑功能,等以后有空再说。

#include<iostream>
#include<string>
#include<cstring>
#include<vector>

using namespace std;

const int N=110;

struct node
{
    
    
	string label,id;//标签无视大小写,属性
	int cnt;//缩进 
	
}a[N];

void lower(string &s)
{
    
    
	for(int i=0;i<s.length();i++)
		s[i]=tolower(s[i]);
}

bool research(node a[],int &start,int &cnt,string s)
{
    
    
	for(int i=start;i>=1;i--)
	{
    
    
		if(a[i].cnt<cnt)
		{
    
    
			cnt=a[i].cnt,start=i;
			if(s==a[i].id||s==a[i].label)
				return true;
		}
	}
	return false;
}

int main()
{
    
    
	int n,m;
	string s;
	cin>>n>>m;
	getchar();
	for(int i=1;i<=n;i++)
	{
    
    
		getline(cin,s);
		int pos1=-1,pos2=-1,cnt=0;
		for(int j=0;j<s.length();j++)
			if(s[j]=='.')
				cnt++;
				
			else if(s[j]!='#'&&pos1==-1)
				pos1=j;
				
			else if(s[j]=='#')
				pos2=j;
		
		a[i].cnt=cnt;
		if(pos2==-1)
		{
    
    
			a[i].label=s.substr(pos1);
			a[i].id="";
		}
		else
		{
    
    
			a[i].label=s.substr(pos1,pos2-pos1-1);
			a[i].id=s.substr(pos2);
		}
		lower(a[i].label);	
		
		
	}
	
	/*for(int i=1;i<=n;i++)
	{
		cout<<a[i].cnt<<a[i].id<<a[i].label<<endl;
	}*/
	
	for(int i=0;i<m;i++)
	{
    
    
		char temp[100];
		vector<string>query;
		vector<int>ans;
		
		gets(temp);
		char *sp=strtok(temp," ");
		while(sp)
		{
    
    
			query.push_back(sp);
			sp=strtok(NULL," ");
		}
		
		int leng=query.size();
		for(int j=0;j<leng;j++)
		{
    
    
			if(query[j][0]!='#')
				lower(query[j]);
		}
		
		
		
		for(int j=1;j<=n;j++)//查找 
		{
    
    
			if(query[leng-1]==a[j].id||query[leng-1]==a[j].label)//最后一级匹配 
			{
    
    
				int k=leng-2,cnt=a[j].cnt,start=j;
				for(;k>=0;k--)
				if(!research(a,start,cnt,query[k]))
					break;	
			
			if(k<0)
			ans.push_back(j);
			}
			
			
		}
		cout<<ans.size();
		if(ans.size()>0)
		{
    
    
			for(int kk=0;kk<ans.size();kk++)
				cout<<" "<<ans[kk];
		}
		cout<<endl;
		
	}

	return 0;
}

 



猜你喜欢

转载自blog.csdn.net/jinyuehai/article/details/106353729
CSP