POJ3630Phone List(字典树)

时间:2023-03-09 03:14:32
POJ3630Phone List(字典树)

参考http://s.acmore.net/show_article/show/58

以附上代码

 #include<iostream>
#include<stdio.h>
#include<string.h>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define Max(a,b) (a > b ? a : b)
#define Min(a,b) (a < b ? a : b) int Trie[][];
int val[];
int S = ;
int idx(char c) {return c - '';} void init()
{
S = ;
memset(Trie,,sizeof(Trie));
memset(val,-,sizeof(val));
} int search_insert(char* s)
{
int u = ;
int n = strlen(s);
for(int i = ; i < n; i++)
{
int c = idx(s[i]);
if(!Trie[u][c])
{//这个结点不存在,插入
Trie[u][c] = S;
val[u] = ;//标记这个结点是单词结点
u = S;
S++;//结点加1
}
else if(Trie[u][c] && val[u] == )
{//如果这个结点存在,而且是单词结点,那么就往下走
u = Trie[u][c];
if(val[u] == )
{//当下一个结点是单词的结束时,直接返回false,表示存在前缀。
return ;
}
}
else if(val[u] == )
{
return ;
}
}
if(val[u] == || val[u] == )
{//检测是不是有前缀
return ;
}
else
{//设置新单词的结尾标记
val[u] = ;
}
return ;
} int main()
{
//freopen("in.txt","r",stdin);
int t,n;
char a[];
scanf("%d",&t);
while(t--)
{
int flag = ;
init();
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
if(!search_insert(a))
{
flag = ;
}
}
if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return ;
}