trie树的模板
/*字符串模板总结——Trie树 * By Joker0429*/ #ifdef unix #define LLD "%lld" #else #define LLD "%I64d" #endif #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cstdlib> #include <cmath> #define LL long long #define maxn 1000 #define INF 1 << 30 #define rep(i, j, k) for (int i = j; i <= k; i++) #define For(i, j) for (int i = 1; i <= j; i++) #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 using namespace std; void file() { freopen(".in", "r", stdin); freopen(".out", "w", stdout); } struct TRIE { struct NODE { int next[27], get; //get:判断一个单词是否到达结尾 //next:1~26个字母数组,储存每个字母出现时的当前节点数 }t[maxn]; void build() { int cnt = 1, n, now; char s[maxn]; scanf("%d\n", &n); t[1].get = 0;//根节点没有东西,每次从她开始:) memset(t[1].next, 0, sizeof(t[1].next)); For(i, n) { scanf("%s", s); now = 1; int ls = strlen(s); rep(j, 0, ls - 1) { int x = s[j] - 'a' + 1; if (t[now].next[x] != 0) now = t[now].next[x];//存在该节点,继续向下走 else {//更新节点数和next t[++cnt].get = 0; memset(t[cnt].next, 0, sizeof(t[cnt].next)); t[now].next[x] = cnt; now = cnt; } } t[now].get = 1;//在单词结尾处打标记 } } int find(char s[maxn]) { int now, ls = strlen(s); now = 1;//从根节点开始 rep(i, 0, ls - 1) { int x = s[i] - 'a' + 1; if (t[now].next[x] != 0) now = t[now].next[x]; else return 0;//如果没有这个字母,返回0 } if (t[now].get == 0) return 0;//如果都有,但不是该单词的结尾,返回0,如:cup,cups这种情况。 return 1; } }tri; void test() { char s[maxn]; int CAS; scanf("%d\n", &CAS); while (CAS--) { scanf("%s", s); if (tri.find(s)) puts("YES"); else puts("NO"); } } int main() { tri.build(); test(); return 0; }
I come, I see, I conquer!