hash的一个变种.
构造的树形如上图,不过有一点要记住,就是这道题中,,用next[id]这个指针来作为节点的地址。而通过next[id]->count来存放有这种前缀的单词的个数。。。
代码:
#include<iostream> #include<cstring> using namespace std; typedef struct Trie { Trie* next[26]; int count; } xixi; xixi root; void maketrie(char* str) //建立树形 { xixi *p=&root,*q; int len=strlen(str); for(int i=0; i<len; i++) { int id=str[i]-'a'; if(p->next[id]==NULL) { q=(xixi*)malloc(sizeof(xixi)); for(int j=0; j<26; j++) { q->next[j]=NULL; } q->count=1; p->next[id]=q; p=p->next[id]; } else { p->next[id]->count++; p=p->next[id]; } } } void findcount(char* str) //计算出现这种前缀的个数count { xixi *p=&root; int len=strlen(str); for(int i=0; i<len; i++) { int id=str[i]-'a'; if(p->next[id]==NULL) { cout<<'0'<<endl; return ; } else { p=p->next[id]; } } cout<<p->count<<endl; return ; } int main(void) { char str[20]; while(gets(str),str[0]!='\0')//这里要注意,不能用‘\n’作为结束,这样就错误了。(哎,还犯这种错误) { maketrie(str); } while(gets(str)) { findcount(str); } return 0; } |