hdu1251统计难题-字典树模板题

来源:互联网 发布:centos 移除安装包 编辑:程序博客网 时间:2024/05/29 11:51

题目:

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
 

Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 

Sample Input
bananabandbeeabsoluteacmbabbandabc
 

Sample Output
2310
 

字典树模板题,无语了,搞了半天的ME结果是选的g++有问题,选c++就能过了

代码:

#include<map>#include<string>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>#include<queue>#include<vector>#include<iostream>#include<algorithm>#include<bitset>#include<climits>#include<list>#include<iomanip>#include<stack>#include<set>const int maxn=111111;using namespace std;int flag;struct Trie{    int v;    Trie *next[26];}*root;void CreatTrie(char *ss){    int len=strlen(ss);    Trie *q,*p=root;    for(int i=0;i<len;i++)    {        int id=ss[i]-'a';        if(p->next[id]==NULL)        {            q=new Trie;            q->v=1;            for(int j=0;j<26;j++)                q->next[j]=NULL;            p->next[id]=q;        }        else        {            p->next[id]->v++;        }        p=p->next[id];    }}void Release(Trie *p){    if(p==NULL)        return;    for(int i=0;i<26;i++)    {        if(p->next[i]!=NULL)            Release(p->next[i]);    }    free(p);    root=NULL;    return;}int FindTrie(char *ss){    int len=strlen(ss);    Trie *p=root;    for(int i=0;i<len;i++)    {        int id=ss[i]-'a';        p=p->next[id];        if(p==NULL)            return 0;    }    return p->v;}void init(){    root=new Trie;    root->v=0;    for(int i=0;i<26;i++)    {        root->next[i]=NULL;    }}int main(){    flag=0;    char s[22];    init();    while(gets(s)&&strcmp(s,"")!=0)            CreatTrie(s);    while(scanf("%s",s)!=EOF)        printf("%d\n",FindTrie(s));    Release(root);    return 0;}