https://www.acwing.com/problem/content/description/163/
思路:字典树:①当前串是否为字典树中的前缀:当前串没有申请新的节点,
②树中的某一串是否为当前串的前缀,当前串进过end标记
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int son[N][10], idx;
bool f[N];
bool insert(char *str)
{
int p = 0;
bool has_new = false;
bool has_found = false;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - '0';
if (!son[p][u])
{
son[p][u] = ++ idx;
has_new = true;
}
p = son[p][u];
if (f[p]) has_found = true;
}
f[p] = true;
return has_new && !has_found;
}
int main()
{
int T;
cin >> T;
while (T -- )
{
cin >> n;
memset(son, 0, sizeof son);
memset(f, false, sizeof f);
idx = 0;
bool res = true;
char str[20];
for (int i = 0; i < n; i ++ )
{
cin >> str;
if (!insert(str)) res = false;
}
if (res) puts("YES");
else puts("NO");
}
return 0;
}