又扒了一段代碼 很簡單 注釋自己看
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAX = 26; //26個字母 若構成字典樹是位元 MAX=2;struct Trie //內部所需可自己定義{ Trie *next[MAX]; bool isword; Trie () { for(int j=0;j<MAX;j++)next[j] = NULL; isword = false;}};Trie *root = new Trie;char word[50000][30];void createTrie(char str[]){ int len = strlen(str); Trie *p = root,*q = NULL; for(int i=0;i<len;i++) { int id = str[i]-'a'; //asii碼檢索 if(p->next[id]==NULL) { q = new Trie; q->isword = false; p->next[id] = q; //後插 } if(i==len-1) p->next[id]->isword = true; //最後一個插入,一個單詞產生! p = p->next[id]; //next[id]是個Trie 指標 指向下一個 }}bool findTrie(char str[]){ int len = strlen(str); Trie *p = root; for(int i=0;i<len;i++) { int id = str[i]-'a'; if(p->next[id]==NULL) { return false; } p = p->next[id]; } if(p->isword) //找到len若尋找的單詞不作為一個單詞(只是有單詞包括在內)在字典樹裡 return true; else return false;}void del(Trie *root) //釋放字典樹 可寫在結構體內{ for(int i=0;i<MAX;i++) { if(root->next[i]!=NULL) { del(root->next[i]); } } delete root;}int main(){ int num=0; char str1[30],str2[30]; while(gets(word[num])) { createTrie(word[num]); num++; } //建樹 for(int i=0;i<num;i++) { int len = strlen(word[i]); if(len==1) continue; for(int j=0;j<len;j++)//從每個單詞的各部分拆開 { int k; if(j==len-1) continue; for(k=0;k<=j;k++) { str1[k] = word[i][k]; } str1[k]='\0'; //串尾結束標誌 int k2=0; for(int l=k;l<len;l++) { str2[k2++]=word[i][l]; } str2[k2]='\0'; if(findTrie(str1)&&findTrie(str2)) { cout<<word[i]<<endl; break;// } } } del(root); return 0;}