题意:给出n个数字串,问其中是否有一个串是另一个串的前缀。
tire的基础应用
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define M 100100
struct node
{
node *son[10];
bool flag;
}trie[M],*root;
char s[15];
struct Trie
{
int sz;
node* createnode()
{
trie[sz].flag=false;
memset(trie[sz].son,0,sizeof(trie[sz].son));
return &trie[sz++];
}
void ini()
{
sz=0;
root=createnode();
}
bool Insert(char str[])
{
node *cur=root;
int val;
int len=strlen(str);
for(int i=0;i<len-1;i++)
{
val=str[i]-'0';
if(cur->son[val]==NULL)
{
cur->son[val]=createnode();
}
else if(cur->son[val]->flag) return true;
cur=cur->son[val];
}
val=str[len-1]-'0';
if(cur->son[val]!=NULL) return true;
else
{
cur->son[val]=createnode();
cur->son[val]->flag=true;
return false;
}
}
}tr;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
tr.ini();
bool flag=0;
int m;
scanf("%d",&m);
while(m--)
{
scanf("%s",s);
if(flag) continue;
flag=tr.Insert(s);
}
if(flag) puts("NO");
else puts("YES");
}
return 0;
}