题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671
解题思路:
当前插入字典树的串在没查完之前遇到了字典树的一个单词的结束节点或者插入完成后字典树下一个节点还不是空的那么就不合题意。
后者还可以理解为整个插入过程没有生成新的节点。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<map>
#include<set>
using namespace std;
#define ll long long
#define for1(i,a,b) for (int i=a;i<=b;i++)
#define for0(i,a,b) for (int i=a;i<b;i++)
#define pb push_back
#define fi first
#define se second
#define debug(x) printf("----Line %s----\n",#x)
#define pt(x,y) printf("%s = %d\n",#x,y)
#define INF 0x3f3f3f3f
#define idx(i) i-'0'
const int N = 1e5+5;
const int sigma_size = 10;
int trie[N][sigma_size];
bool val[N];
char s[15];
int sz;
void init(int x)
{
memset(trie[x],0,sizeof trie[x]);
val[x] = 0;
}
bool insert(char *s)
{
int u=0;
bool flag = false;
for (int i=0;s[i];i++){
int v = idx(s[i]);
if (!trie[u][v]){
flag = true;
init(sz);
trie[u][v] = sz++;
}
u = trie[u][v];
if (val[u]) return false;
}
val[u] = true;
return flag;
}
int main()
{
//freopen("C:/Users/DELL/Desktop/input.txt", "r", stdin);
//freopen("C:/Users/DELL/Desktop/output.txt", "w", stdout);
int T;
scanf("%d",&T);
while (T--){
sz = 1;
init(0);
int n;
scanf("%d",&n);
bool ans = true;
while (n--){
scanf("%s",s);
if (!ans) continue;
else ans = insert(s);
}
if (ans) printf("YES\n");
else printf("NO\n");
}
return 0;
}