题目链接AC代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+6;
int son[maxn][20],cnt[maxn],idx;
string ss[maxn];
void insert(string s) {
int p=0;
for(int i=0; i<s.size(); i++) {
int u=s[i]-'0';
if(!son[p][u]) {
son[p][u]=++idx;
cnt[p]++;
}
p=son[p][u];
}
cnt[p]++;
}
int num(string s) {
int p=0;
for(int i=0; i<s.size(); i++) {
int u=s[i]-'0';
if(!son[p][u])return 0;//这个问题里面是不会出现这个情况的,可以去掉
p=son[p][u];
}
return cnt[p];
}
int main() {
int t;
cin>>t;
while(t--) {
memset(son,0,sizeof(son));
memset(cnt,0,sizeof(cnt));
idx=0;
int n;
cin>>n;
for(int i=1; i<=n; i++) {
cin>>ss[i];
insert(ss[i]);
}
int flag=1;
for(int i=1; i<=n; i++) {
if(num(ss[i])>1)flag=0;
//cout<<num(ss[i])<<endl;
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
然而上面这个字典树还没有直接暴力来的的快(以前写的另一种做法,给字符串先排序,如果存在子串关系,那一定是相邻的,只比较相邻的就行)AC代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
string s[20000];
int t,n;
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
char p[20000];
scanf("%s",p);
s[i]=p;
}
sort(s,s+n);
int flag=0,j;
for(int i=1;i<n;i++){
if(s[i].size()>s[i-1].size()){
for(j=0;j<s[i-1].size();j++)
if(s[i][j]!=s[i-1][j])break;
if(j==s[i-1].size())flag=1;
}
}
if(!flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}