hdu2027 trie树 字典树模板
#include <iostream> #include <cstdio> #include <cstring> #include <sstream> using namespace std; #define Max 26 const int maxn=100000; typedef struct TrieNode{ int nCount;//根据需要改变 struct TrieNode *next[Max]; }TrieNode; TrieNode *root=NULL; int allcop=0,ans,flag; TrieNode memory[maxn]; TrieNode *CreatTrieNode(){ TrieNode *temp=&memory[allcop++]; temp->nCount=0; for(int i=0;i<Max;i++) temp->next[i]=NULL; return temp; } void InsertTrie(TrieNode **pRoot,char *str){ TrieNode *temp=*pRoot; int i=0,k; while(str[i]){ k=str[i]-'a'; if(temp->next[k]){ //temp->next[k]->nCount++; } else temp->next[k]=CreatTrieNode(); temp=temp->next[k]; i++; } temp->nCount++; } int SearchTrie(TrieNode *root,char *str){ if(root==NULL) return 0; TrieNode *temp=root; int i=0,k; while(str[i]){ k=str[i]-'a'; if(temp->next[k]){ temp=temp->next[k]; } else return 0; i++; } return temp->nCount; } void Traverse(TrieNode *root){ for(int i=0;i<Max;i++){ if(root->next[i]){ if(root->next[i]->nCount>0) ans++; Traverse(root->next[i]); } } } char str[1010]; void init(){ ans=0; flag=0; allcop=0; memset(memory,0,sizeof(memory)); root=CreatTrieNode(); } int main() { while(1){ init(); string line; getline(cin,line); stringstream ss(line); while(ss>>str) { if(str[0]=='#') { flag=1; break; } InsertTrie(&root,str); } if(flag) break; Traverse(root); printf("%d\n",ans); } return 0; }
输入方式值得学习