字典树应用
题意:给你一些数字串,让你找一个数字串是否为另一个数字串的前缀
思路:把所以的数字串存入字典树中,然后查找所以的数字串,如果该串出现过两次以上,则是另外一个数字串的前缀
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 100010
int cur=1;
char str[maxn][20];
int vis[maxn];
struct node
{
int num;
int next[15];
void init()
{
num=0;
memset(next,-1,sizeof(next));
}
} trie[maxn];
void insert(char *s,int len)
{
int p=0;
for(int i=0; i<len; i++)
{
int x=s[i]-'0';
if(trie[p].next[x]==-1)
{
trie[cur].init();
trie[p].next[x]=cur++;
}
p=trie[p].next[x];
trie[p].num++;
}
}
bool find(char *s,int len)
{
int p=0;
for(int i=0; i<len; i++)
{
int x=s[i]-'0';
p=trie[p].next[x];
}
if(trie[p].num>=2)return false;//这个串是另外一个数字串的前缀
else return true;
}
int main()
{
int n,t;
scanf("%d",&t);
while(t--)
{
cur=1;
trie[0].init();
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",str[i]);
int len=strlen(str[i]);
vis[i]=len;
insert(str[i],len);
}
bool flag;
for(int i=0;i<n;i++)
{
flag=find(str[i],vis[i]);
if(!flag)break;
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}