用Trie树判断前缀,或者暴力排序直接找
#include<stdio.h>
#include<string.h>
const int N = 10010, M = N * 10;
char str[N][15];
int son[M][26],cnt[M],idx;
void insert(char *str)
{
int p=0;
for(int i=0;str[i];i++)
{
int u=str[i]-'0';
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u];
}
cnt[p]++;
}
bool query(char *str)
{
int p=0;
for(int i=0;str[i];i++)
{
int u=str[i]-'0';
if(cnt[p]) return true;
p=son[p][u];
}
return cnt[p]>=2;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
memset(son,0,sizeof son);
memset(cnt,0,sizeof cnt);
idx=0;
int n;scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",str[i]);
insert(str[i]);
}
bool flag=false;
for(int i=0;i<n;i++)
{
if(query(str[i]))
{
flag=true;
break;
}
}
puts(flag?"NO":"YES");
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
string a[N];
int main()
{
ios::sync_with_stdio(false);
int T;cin>>T;
while(T--)
{
int n;cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
bool flag=false;
for(int i=1;i<n;i++)
{
if(a[i].find(a[i-1])!=string::npos)
{
flag=true;
break;
}
}
if(flag) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}