有 t 组测试,每组测试有 n 个 01 字符串,查询每个字符串是否是其他字符串的前缀
题目利用字典树应该是可以在插入过程中得出答案
const int N=1e5+5;
int n,m;
int i,j,k;
char s[N][15];
int t[N][10];
int sum[N],tot=0;
int idx(char ch){ return ch-'0'; }
void insert(char *s,int rt)
{
for(int i=0;s[i];i++){
int x=idx(s[i]);
if(!t[rt][x]) t[rt][x]=++tot;
rt=t[rt][x];
}
sum[rt]=1;
}
bool find(char *s,int rt)
{
int len=strlen(s);
for(int i=0;i<len-1;i++){
int x=idx(s[i]);
rt=t[rt][x];
if(sum[rt]) return false;
}
return true;
}
int main()
{
//IOS;
rush(){
sd(n);
int flag=1;
for(int i=1;i<=n;i++){
ss(s[i]);
insert(s[i],0);
}
for(int i=1;i<=n && flag;i++)
flag=find(s[i],0);
puts(flag?"YES":"NO");
for(int i=0;i<=tot;i++){
sum[i]=0;
for(int j=0;j<10;j++) t[i][j]=0;
}
tot=0;
}
//PAUSE;
return 0;
}