比赛 “Asm.Def战记之太平洋”杯 评测结果 AAAAAAAAAA
题目名称 Asm.Def谈笑风生 最终得分 100
用户昵称 Regnig Etalsnart 运行时间 0.623 s
代码语言 C++ 内存使用 238.73 MiB
提交时间 2018-11-07 14:09:17
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int m,cmd,t[2000000][30],dep[2000000],cnt;
bool flag[2000000];
void in(string s)
{
	int now=0,len=s.length();
	for(int i=0;i<len;i++)
	{
		int ch=s[i]-'a';
		if(!t[now][ch])
		t[now][ch]=++cnt;
		now=t[now][ch];
	}
	flag[now]=1;
	return;
}
bool find(string s)
{
	int len=s.length();
	queue<int>Q;
	Q.push(0);
	while(!Q.empty())
	{
		int now=Q.front();Q.pop();
		if(s[dep[now]]=='*')
		{
			for(int i=0;i<26;i++)
			{
				if(t[now][i])
				{
					dep[t[now][i]]=dep[now]+1;
					Q.push(t[now][i]);
					if(dep[now]==len-1&&flag[t[now][i]])return 1;
				}
			}
		}
		else
		{
			int ch=s[dep[now]]-'a';
			if(t[now][ch])
			{
				dep[t[now][ch]]=dep[now]+1;
				Q.push(t[now][ch]);
			}
			if(dep[now]==len-1&&flag[t[now][ch]])return 1;
		}
	}
	return 0;
}
int main()
{
	freopen("asm_talk.in","r",stdin);
	freopen("asm_talk.out","w",stdout);
	scanf("%d",&m);
	while(m--)
	{
		string s="";
		scanf("%d",&cmd);
		cin>>s;
		if(cmd==1)in(s);
		else if(find(s))printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}