静态字典树
看了好久的字典树,挺简单的一个结构,愣是看了这么久才写出来。。。
专心一点就不会这样了。。。。
接下来就去刷刷字典树的题吧。。。。。。。
下面是字典树。。。。
定义节点
typedef struct Trie{
char val; //其实这东西没啥软用。。。注释掉也一样。。。没有变化
bool isword;
struct Trie *next[26];
}*Trie_pointer;
然后建树
这几天抽风了。。。
把memset写在函数外面去了。。。。
编译老半天过不去。。。。
日了。。。。。。。
代码:
#include<bits/stdc++.h>
using namespace std;
#define mem(a) memset(a,0,sizeof(a))
#define long long ll; typedef struct Trie{
char val;
bool isword;
struct Trie *next[];
}*Trie_pointer; Trie trie[]; int tot; Trie_pointer CreateNode()
{
return &trie[tot++];
} void Insert(Trie_pointer root, char *s)
{
if(*s == '\0')
return;
char *p = s;
Trie_pointer tmp,t = root;
while(*p != '\0')
{
if(t->next[*p - 'a'] == NULL)
{
tmp = CreateNode();
tmp->val = *p;
t->next[*p - 'a'] = tmp;
}
t = t->next[*p - 'a'];
p++;
}
t->isword = ;
} bool Search(Trie_pointer root, char *s)
{
Trie_pointer tmp,t = root;
if(*s == '\0')
return false;
while(*s != '\0')
{
if(t->next[*s - 'a'] ==NULL)
return false;
t = t->next[*s -'a'];
s++;
}
if(t->isword == )
return false;
return true;
} int main()
{
Trie root;
char s[];
int i,n;
mem(trie,,sizeof(trie));
mem(&root,,sizeof(root));
cin>>n;
for(i=; i<=n; i++)
{
cin>>s;
Insert(&root,s);
}
while(cin>>s)
{
bool flag = Search(&root,s);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return ;
}