字典树模板--静态 ----HDU 1251

来源:互联网 发布:淘宝模特拍照24姿势 编辑:程序博客网 时间:2024/04/30 05:35

HDU 1251   http://acm.hdu.edu.cn/showproblem.php?pid=1251

题意:给你一些单词,再给你一些前缀,输出对应的给定的单词是这些前缀的个数。

思路:把这些单词建立一个字典树,走过一个节点对应的计数器就垒加,再分别找前缀发现没有走过的节点就直接输出0,如果没输出0就输出对应节点的记数变量就OK了。

#include<cstdio>#include<cstring>struct Node{    int s[26];    int index;    void init()    {        memset(s,-1,sizeof(s));        index=0;    }}f[1000000];int cnt=1;void work(char m[]){    int len=strlen(m);    int p=0;    for(int i=0;i<len;i++)    {        if(f[p].s[m[i]-'a']==-1)        {            f[p].s[m[i]-'a']=cnt;            cnt++;            f[cnt-1].init();        }            p=f[p].s[m[i]-'a'];        f[p].index++;    }}int find(char m[]){    int len=strlen(m);    int p=0;    for(int i=0;i<len;i++)    {        p=f[p].s[m[i]-'a'];        if(p==-1)            return 0;    }    return f[p].index;}int main(){    char m[18];    f[0].init();    while(gets(m)!=NULL&&strlen(m))        work(m);    while(gets(m)!=NULL)        printf("%d\n",find(m));    return 0;}



0 0
原创粉丝点击