个人感觉trie作为一种数据结构其实并不难,在hdu上早先干掉了1251、1075,今天干掉了1247、1671,1247看懂题以后想了一下没有想出,后来参照网上代码,输入数据存入字典树后,再重新例举已输入的串,每一个串代入到字典树中,先判断是不是前缀,然后判断其后的那个单词是不是在字典树中,1671个人认为较为简单,设置一个count成员变量记录有多少个串通过该字母,判断的时候只要count>1&&x[i+1]=='/0'就可以了。
附1671代码:
#include<iostream>using namespace std;const int tot=11;const int fir='0';const int len=10000;struct Node{ int son[tot]; int end; int count; void to0() { count=0; memset(son,-1,sizeof(son)); end=0; } }node[len*10];int num;void insert(char *x){ int len = strlen(x),root = 0; for (int i = 0; i < len; i++){ int k = x[i]-fir; if (node[root].son[k]==-1){ num ++; node[root].son[k] = num; node[num].to0(); } root=node[root].son[k]; node[root].count++; } node[root].end++; }int search(char *x){ int len=strlen(x),root=0,i; for ( i = 0; i<len; i++){ int temp=x[i]-fir; if (node[root].son[temp]==-1)return 0; root=node[root].son[temp]; if (node[root].count>1&&x[i+1]=='/0')return 1;//此句让我wa了N次 } return 0;}char x[10001][11];int main(){ int t; cin >> t; while (t--){ int n; cin >> n; num=0; node[0].to0(); for (int i=0;i<n;i++){ scanf("%s",x[i]); insert(x[i]); } int check = 0; for (int i =0;i<n;i++){ if (search(x[i])){check = 1;break;} } if (check){printf("NO/n");} else printf("YES/n"); } //system("pause"); return 0; }