看下呗 我这写法比较容易理解
// Created by Jonny; on 24-11-23.
#include <bits/stdc++.h>
using namespace std;
const int N=1e4*20+10;
int num[N][10];//0到9十个数字
int idx=0;
string s[N];
int en[N];//统计是否有字符串在第i个位置结束
bool flag;
bool cmp(string a,string b) {
return a.length()<b.length();
}
//构造字典树
void insert(string phoneNum) {
int p=0;
for(int i=0;i<phoneNum.length();i++) {
int singleNum=phoneNum[i]-'0';
if(num[p][singleNum]) {
p=num[p][singleNum];
if(en[p]!=0) {
flag=false;
break;
}
}
else {
num[p][singleNum]=++idx;
p=num[p][singleNum];
}
if(i==phoneNum.length()-1) en[p]++;
}
}
int main() {
int t,n;
cin>>t;
while(t--) {
memset(num,0,sizeof(num));
memset(en,0,sizeof(en));
idx=0;
flag=true;
cin>>n;
for(int i=1;i<=n;i++) {
cin>>s[i];
}
//O(nlogn)
sort(s+1,s+n+1,cmp);
//O(n*10)
for(int i=1;i<=n;i++) insert(s[i]);
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}