#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #define INF 0x3f3f3f3f using namespace std; const int maxn = 300000; int Tire[maxn][10]; bool v[maxn]; char st[10010][15]; int cnt = 1; //建树,每输入一个单词到 s 里面就调用_insert()就好 void _insert(int t){ int root = 0; for(int i=0;st[t][i];i++){ int next = st[t][i] - '0'; if(!Tire[root][next]) Tire[root][next] = ++cnt; root = Tire[root][next]; } v[root] = true;//这里用了一个标记数组表示该点存在一个完整的单词,比如说`app`和`apple` } int _find(char bufs[]){ int root = 0; int next; for(int i=0;bufs[i];i++){ next = bufs[i] - '0'; root = Tire[root][next]; // cout<<bufs[i]<<endl; if(v[root]&&i!=strlen(bufs)-1){ return 0; } } return 1; } int main(){ int T; scanf("%d",&T); while(T--){ int n; bool flag=true; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",&st[i]); _insert(i); } for(int i=0;i<n;i++){ if(_find(st[i])) continue; flag=0; break; } if(flag) printf("YES\n"); else printf("NO\n"); memset(Tire,0,sizeof(Tire)); memset(v,0,sizeof(v)); cnt=0; } return 0; } |
Double click to view unformatted code.