http://poj.org/problem?id=3630
简单的trie树问题,先添加,然后每个跑一边看中途有没有被打上结束标记即可。
#include<cstdio> #include<cstring> using namespace std; struct node{ bool ed; int son[11]; void clear(){ memset(son,0,sizeof(son)); ed=0; } }tree[100001]; char s[10001][11]; int tot; void insert(int k){ int l=strlen(s[k]); int now=1; for(int i=0;i<l;i++){ if(tree[now].son[s[k][i]-'0']==0){ tot++; tree[now].son[s[k][i]-'0']=tot; } now=tree[now].son[s[k][i]-'0']; } tree[now].ed=1; return; } bool check(int k){ int l=strlen(s[k]); int now=1; for(int i=0;i<l;i++){ if(tree[now].son[s[k][i]-'0']==0){ return 0; } if(tree[now].ed)return 1; now=tree[now].son[s[k][i]-'0']; } return 0; } int main(){ int t; scanf("%d",&t); while(t--){ for(int i=1;i<=100000;i++)tree[i].clear(); tot=1; int n;bool ok=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s[i]); insert(i); } for(int i=1;i<=n;i++){ if(check(i)){ ok=1; break; } } if(ok==1)printf("NO "); else printf("YES "); } return 0; }