比赛 “Asm.Def战记之太平洋”杯 评测结果 AAWWWWWAWW
题目名称 Asm.Def谈笑风生 最终得分 30
用户昵称 高哥 运行时间 0.374 s
代码语言 C++ 内存使用 20.47 MiB
提交时间 2015-11-02 09:56:41
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 210000
using namespace std;
int m;
//struct Tire{
	int ch[N][27];
	int val[N];
	int sz;
	//Tire(){sz=1;memset(ch[0],0,sizeof(ch[0]));}
void init()
{
	sz=1;memset(ch[0],0,sizeof(ch[0]));
}
	int idx(char c) {return c=='*'? 26 : c-'a';}

	void insert(char *s,int v)
	{
		int u=0,n=strlen(s);
		for(int i=0;i<n;i++)
		{
			int c=idx(s[i]);
			if(!ch[u][c]){
				memset(ch[sz],0,sizeof(sz));
				val[sz]=0;
				ch[u][c]=sz++;
			}
			u=ch[u][c];
		}
		val[u]=v;
	}
	
	bool query(char *s)
	{
		int u=0,n=strlen(s);
		for(int i=0;i<n;i++)
		{
			int c=idx(s[i]);
			if(ch[u][c])
			  u=ch[u][c];
			else
			  return false;
		}
		if(val[u]) return true;
		else return false;
	}
	
//};
int main()
{
	freopen("asm_talk.in","r",stdin);
	freopen("asm_talk.out","w",stdout);
	init();
	scanf("%d",&m);
	int op;
	//Tire tire=Tire();
	char s[30];
	for(int i=1;i<=m;i++)
	{
		scanf("%d %s",&op,s);
		if(op==1)
		  insert(s,1);
		else
		{
			int len=strlen(s);
			bool c=false;
			for(int i=0;i<len;i++)
			{
			  if(s[i]=='*')
			    for(int j='a';j<='z';j++)
			    {
			    	s[i]=j;
			    	
			    	if(query(s))
			    	{
			    	  printf("YES\n");
			    	  {
			    	  	c=true;
			    	  	continue;
			    	  }
			    	}
			    	
			    }
			}
			if(query(s))
			{
			  printf("YES\n");
			  continue;
			}
			if(!c)
			printf("NO\n");
		}
	}
	
	return 0;
}
/*
6
1 ab
2 ab*
1 abc
1 adc
2 *d
2 abc

7
1 ababa
1 dilge
1 koijj
2 dil*e
2 ko*
2 *baba
2 koij*
*/