啊~,很水的一道trie树模板题;
当两个串存在关系时情况有两种:
若当前串插入后没有任何新建节点,则该串肯定是之前插入的某个串的前缀;
若在插入的时候,有某个经过的节点带有某串结尾的标记,则之前插入的某个串是当前串的;
#include<bits/stdc++.h> using namespace std; int n,tot; int ch[100010][20]; bool bo[100010]; char s[20]; inline bool insert(char *s) { int len=strlen(s); int u=1; bool flag=false; for(int i=0;i<len;i++){ int c=s[i]-'0'; if(!ch[u][c]) ch[u][c]=++tot; else if(i==len-1) flag=1; u=ch[u][c]; if(bo[u]){ flag=1; } } bo[u]=1; return flag; } int main() { int t; cin>>t; while(t--){ memset(ch,0,sizeof(ch)); memset(bo,false,sizeof(bo)); scanf("%d",&n); tot=1; bool ans=0; for(int i=1;i<=n;i++){ scanf("%s",s); if(insert(s)) ans=1; } if(ans) cout<<"NO"<<endl; else cout<<"YES"<<endl; } return 0; }