比赛 “Asm.Def战记之太平洋”杯 评测结果 AWWWWWWWWW
题目名称 Asm.Def谈笑风生 最终得分 10
用户昵称 zero_std 运行时间 0.144 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2015-11-02 10:35:42
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <stack>
#include <algorithm>
#include <string>
#include <vector>
#include <ctime>
#include <bitset>
typedef long long LL;
#define INF 0x3f3f3f3f
using namespace std;

struct Edge {
	int u, v, w;
};

template <class T> inline T min(T& a, T& b) {
	return a > b ? b : a;
}

template <class T> inline T max(T& a, T& b) {
	return a < b ? b : a;
}

template <class T> inline T abs(T& a) {
	return a > 0 ? a : -a;
}

template <class T> inline void CLR(T *a, int num) {
	memset(a, num, sizeof(a));
}

int pt = 0;

struct Trie {
	int ch[30][30];
	int v[30][30];
	Trie() {
		memset(ch, 0, sizeof(ch));
		memset(v, 0, sizeof(v));
	}
	int idx(char x) {
		return x - 'a';
	}
	inline void insert(char* s) {
		int i, len = strlen(s);
		for(i = 0;i < len;i ++) {
			if(!ch[i][idx(s[i])]) {
				ch[i][idx(s[i])] = 1;
				v[i][idx(s[i])] = 0;
			}
		}
		v[len - 1][idx(s[len - 1])] = 1;
	}
	inline bool fnd(char* s, int now) {
		int i, len = strlen(s);
		for(i = now;i < len;i ++) {
			if(s[i] != '*' && !ch[i][idx(s[i])]) {
				return 0;
			}
			if(s[i] == '*') {
				bool kick = 0;
				for(int j = 0;j < 26;j ++) {
					if(ch[i][j]) {
						if(fnd(s, i + 1)) kick = 1;
						break;
					}
				}
				if(!kick) {
					return 0;
				}
				else {
					return 1;
				}
			}
			if(ch[idx(s[i])]) {
				continue;
			}
		}
		if(v[len - 1][idx(s[len - 1])]) return 1;
		return 0;
	}
};

int N;
Trie trie;

inline void in() {
	int ope;
	char str[30];
	scanf("%d", &N);
	for(int i = 0;i < N;i ++) {
		memset(str, '\0', sizeof(str));
		scanf("%d%s", &ope, &str);
		if(ope == 1) {
			trie.insert(str);
		}
		if(ope == 2) {
			if(trie.fnd(str, 0)) {
				printf("YES\n");
			}
			else {
				printf("NO\n");
			}
		}
	}
}

int main() {
	freopen("asm_talk.in", "r", stdin);
	freopen("asm_talk.out", "w", stdout);
	in();
	return 0;
}