题目链接:https://loj.ac/problem/10049
思路:字典树模板题具体看代码
#include<bits/stdc++.h>
#define ll long long
#define N 100861
#define inf 0x3f3f3f3f
using namespace std;
int ch[10][N],tot;
bool book[N];
void Init()
{
memset(ch,0,sizeof(ch));
memset(book,false,sizeof(book));
}
int solve(char s[])
{
int l=strlen(s);
int flag=0,u=1;//u是用来记录所在位置的,初始化当前位置为节点1
for(int i=0;i<l;i++)
{
int c=s[i]-'0';
if(!ch[c][u])//如果从当前位置没有一条通向数字c的路
ch[c][u]=++tot;//创建一个新节点,并把这条边给记录
else if(i==l-1)//如果从当前位置有一条通向数字c的路且当前单词已经结束
flag=1;//说明这个单词是前面所输入单词其中几个的前缀
u=ch[c][u];//令u等于当前节点所指向的节点
if(book[u])//如果当前节点所指向的节点位置是一个单词的尾部
flag=1;
}
book[u]=true;//把单词尾部标记为true
return flag;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
Init();
tot=1;
bool flag=false;
for(int i=0;i<n;i++)
{
char s[11];
scanf("%s",s);
if(solve(s))
flag=true;
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}