秋雅是我弟妹!![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d28252e62648175406bcbe35b213363f.png)
- 分析:样例中前缀在含有前缀的字符串前边,还有一种可能就是字符串先输入,再输入其含有的前缀字符串。所以可以在插入函数中记录该字符出现的次数(如果 后缀后出现,后缀的最后尾字母次数大于1说明前边有字符串了)和标记最后一个字母的位置(标记可能出现的后缀)。标记的三个数组一定要大于十万,n最多有一万个字符串,每个字符串最好含10个字符。
- AC代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
typedef long long ll;
using namespace std;
int idx,flag;
int cnt[100010][20],book[100010][20],vis[100010][20];
char a[100100][20];
void insert(int k)
{
int p=0,i,t;
for(i=0;a[k][i];i++)
{
t=a[k][i]-'0';
if(!book[p][t])
book[p][t]=++idx;
p=book[p][t];
vis[p][t]++;
if(cnt[p][t])
{
flag=1;
}
}
if(vis[p][t]>1)
{
flag=1;
}
cnt[p][t]=1;
}
int main()
{
int t,n,i;
scanf("%d",&t);
while(t--)
{
idx=0;
memset(book,0,sizeof(book));
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
flag=0;
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
insert(i);
}
if(flag)
printf("NO\n");
else printf("YES\n");
}
}