字典树模板
假设给出的字符串在集合'a'--'z'内,trie[p][x]表示,p节点有没有向外连接的边,边上的字符是集合当中的字符,vis数组表示终止节点。字典树可以查找某个字符串在给出的字符串当中,有没有出现过。当然还有好多用处,刚开始学,还不太了解。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
char s[50];
int trie[N][30], n, m, k;
bool vis[N];
void insert(char w[])
{
int len = strlen(w);
int p = 0;
for(int i = 0; i < len; i++)
{
int x = w[i] - 'a';
if(!trie[p][x])
trie[p][x] = k++;
p = trie[p][x];
}
vis[p] = 1;
}
int search(char w[])
{
int len = strlen(w);
int p = 0;
for(int i = 0; i < len; i++)
{
int x = w[i] - 'a';
if(!trie[p][x]) return 0;
p = trie[p][x];
}
return vis[p] == 1;
}
int main()
{
k = 1;
memset(trie, 0, sizeof trie);
memset(vis, 0, sizeof vis);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
scanf("%s", s);
insert(s);
}
for(int i = 1; i <= m; i++)
{
scanf("%s", s);
if(search(s))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}