#include<cstdio> #include<iostream> #include<string> #include<cstdlib> #define maxn 10 using namespace std; struct Tri { Tri*next[maxn]; int num; }; Tri *root; void buildTri(string ss)//建树的过程是一个动态的过程 动插的过程 { Tri *p=root,*q; for(int i=0;i<ss.size();i++) { int id=ss[i]-'0'; if(p->next[id]==NULL) { q=(Tri*)malloc(sizeof(Tri)); q->num=1; for(int j=0;j<maxn;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else p=p->next[id],p->num++; } p->num=-1;// 作为结束的标志 } int findTri(string ss) { Tri *p=root,*q; for(int i=0;i<ss.size();i++) { int id=ss[i]-'0'; p=p->next[id]; if(p==NULL) return 0; if(p->num==-1) return -1; } return -1; } void del(Tri *root) { Tri *zz=root; if(zz==NULL) return; for(int i=0;i<maxn;i++) { if(zz->next[i]!=NULL) del(zz->next[i]); } free(zz); } int main() { int t; cin>>t; while(t--) { root=(Tri*)malloc(sizeof(Tri)); for(int i=0;i<maxn;i++) root->next[i]=NULL; root->num=1; int ret; cin>>ret; string ss; int flag=1; while(ret--) { cin>>ss; if(findTri(ss)==-1) flag=0; // cout<<flag<<endl; buildTri(ss); } del(root); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }