就Trie的插入和查找
//注意此题是找到前缀输出no,否则输出yes #include<bits/stdc++.h> using namespace std; int n,t,flag,cnt,trie[110001][21]; int ed[110001],vis[110001]; char ch[21]; void up() { flag=0;cnt=0; memset(ed,0,sizeof(ed)); memset(vis,0,sizeof(vis)); memset(trie,0,sizeof(trie)); } void find() { int nxt=0,len=strlen(ch+1); for(int i=1;i<=len;i++) { int num=ch[i]-'0'; if(!trie[nxt][num]) trie[nxt][num]=++cnt; nxt=trie[nxt][num]; //取出它的下一条边 if(vis[nxt]&&i==len) //如果这条边已存在,且i==len,则说明找到前缀 { flag=1; return; } vis[nxt]=1; // 加入这条边到trie中 if(ed[nxt]) //如果这条边被打上结尾标记的话 { flag=1; return; } } ed[nxt]=1; //打上结尾标记 } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n);up(); for(int i=1;i<=n;i++) { scanf("%s",ch+1); if(!flag) { find(); } } if(flag) printf("NO\n"); else printf("YES\n"); } return 0; }