trie树简单题。
需要注意一下数组范围,以及建树查找的顺序,以实现代码简洁明了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
const int N=1e4+5,L=10;
int tot,trie[N*L][10],cnt[N*L];
int T,n;
bool jay;
struct number{int len; char s[L];}num[N];
inline void build(char str[],int rt)
{
int len=strlen(str);
for (register int i=0; i<len; ++i)
{
int x=str[i]-'0';
if (!trie[rt][x]) trie[rt][x]=++tot;
rt=trie[rt][x];
if (i==len-1) cnt[rt]++;
}
}
inline bool find(char str[],int rt)
{
int len=strlen(str);
for (register int i=0; i<len; ++i)
{
int x=str[i]-'0';
if (!trie[rt][x]) return false;
rt=trie[rt][x];
if (cnt[rt]) return true;
}
return false;
}
inline bool cmp(number a,number b)
{
return a.len<b.len;
}
int main(){
scanf("%d",&T);
while (T--)
{
jay=false;
tot=0; memset(trie,0,sizeof(trie)); memset(cnt,0,sizeof(cnt));
scanf("%d",&n);
for (register int i=1; i<=n; ++i)
{
scanf("%s",num[i].s);
num[i].len=strlen(num[i].s);
}
sort(num+1,num+n+1,cmp);
for (register int i=1; i<=n; ++i)
{
if (find(num[i].s,0)) {jay=true; break;}
build(num[i].s,0);
}
if (jay) puts("NO");
else puts("YES");
}
return 0;
}