字典树,顾名思义就是将字符串像树一样的串起来其结构为
struct Tree
{
bool x;
Tree *next[26];
}
表示每一个单词的每个字母,串起来后方便查找
模板:题目链接~~~~点击打开链接
代码
#include<stdio.h>
#include<string.h>
#define NULL 0
using namespace std;
char an[20];int top;
struct AC
{
int x;
struct AC *next[10];
}qq[1000100];
AC *jian()
{
qq[top].x=0;
for(int i=0; i<10; i++) qq[top].next[i]=NULL;
return &qq[top++];
}
bool In(char *a,struct AC *h)
{
struct AC *p;//p当前 q前一个
int f=0;//f=1 ze shi
int k=strlen (a);
p=&qq[0];
for(int i=0; i<k; i++)
{
if(p->next[a[i]-'0']==NULL)
{
p->next[a[i]-'0']=jian();
f=1;
}
p=p->next[a[i]-'0'];
if(p->x) return 1;
}
p->x=1;
if(f)
return 0;
return 1;
}
int main()
{
int N;
scanf("%d",&N);
while(N--)
{
top=0;
char a[20];
int n;
scanf("%d",&n);
struct AC *h;
h=jian();
int f=1;
while(n--)
{
scanf("%s",a);
if(f&&In(a,h)) f=0;
}
if(f) printf("YES\n");
else printf("NO\n");
}
}
删除操作:
void del(node *p)
{
if(p==NULL) return ;
for(int i=0; i<10; i++)
if(p->next[i]) del(p->next[i]);
delete p;
return ;
}
如果仅有一组测试数据,删除操作可以不写。。。。。