记录编号 203101 评测结果 AAAAAAAAAA
题目名称 [SYOI 2015] Asm.Def谈笑风生 最终得分 100
用户昵称 Gravatarfyb 是否通过 通过
代码语言 C++ 运行时间 0.555 s
提交时间 2015-11-02 16:23:22 内存使用 0.31 MiB
显示代码纯文本
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

#define MMAX 100000
#define LMAX 20
#define NUM 26

struct node{
	int s[NUM];
	bool v[NUM];
};

vector<node> tire;
char ts[LMAX+1];
node nd0;

bool dfs(int pt,int tp,int lents){
	if(tp==lents-1)return tire[pt].v[ts[tp]-'a'];
	else if(!tire[pt].s[ts[tp]-'a'])return false;
	else return dfs(tire[pt].s[ts[tp]-'a'],tp+1,lents);
}

int main(){
	int m;
	int tt,tl;
	bool fndx,fnde;
	int pt;
	int i,j,k;

	freopen("asm_talk.in","r",stdin);
	freopen("asm_talk.out","w",stdout);

	scanf("%d",&m);
	tire.push_back(nd0);
	for(i=0;i<m;i++){
		scanf("%d%s",&tt,ts);
		tl=strlen(ts);
		if(tt==1){
			pt=0;
			for(j=0;ts[j+1]!='\0';j++){
				if(!tire[pt].s[ts[j]-'a']){
					tire[pt].s[ts[j]-'a']=tire.size();
					tire.push_back(nd0);
				}
				pt=tire[pt].s[ts[j]-'a'];
			}
			tire[pt].v[ts[j]-'a']=true;
		}else{
			fndx=false;
			for(j=0;j<tl;j++)
				if(ts[j]=='*'){
					fndx=true;
					fnde=false;
					for(k=0;k<NUM;k++){
						ts[j]='a'+k;
						if(dfs(0,0,tl)){
							printf("YES\n");
							fnde=true;
							break;
						}
					}
					if(!fnde)printf("NO\n");
				}
			if(!fndx)printf(dfs(0,0,tl)?"YES\n":"NO\n");
		}
	}
	return 0;
}