码迷,mamicode.com
首页 > 其他好文 > 详细

Tire 字典树&& uva1401

时间:2014-07-12 00:41:50      阅读:423      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   for   io   div   

题意:给一个长字符串s(1<|s|<300000),和n(n<4000)个单词,求出有多少种把s分成单词的方法(白书P209)。

打模板!

#include<cstdio>
#include<cstring>

#define MOD 20071027
#define maxnode 4010*101
#define MAXLEN 300005
#define sigema_size 26

int ca=0,S,d[MAXLEN];
char str[MAXLEN],tmp[105];

struct Trie
{
    int sz;
    int ch[maxnode][sigema_size];
    int val[maxnode];

    void init() {sz=1;memset(ch,0,sizeof(ch));memset(val,0,sizeof(val));}
    int idx(char c) {return c-a;}
    void insert(char *s)
    {
        int u=0;
        for(int i=0;s[i];++i)
        {
            int c=idx(s[i]);
            if(!ch[u][c])
            {
                memset(ch[sz],0,sizeof(ch[c]));
                ch[u][c]=sz++;
            }
            u=ch[u][c];
        }
        val[u]=1;
    }
    int find(char *s,int a)
    {
        int u=0,ans=0;
        for(int i=a;s[i];++i)
        {
            int c=idx(s[i]);
            if(!ch[u][c]) return ans;
            u=ch[u][c];
            if(val[u]) ans=(ans+d[i+1])%MOD;
        }
        return ans;
    }
}trie;
void solve()
{
    int n=strlen(str);
    d[n]=1;
    for(int i=n-1;i>=0;--i) d[i]=trie.find(str,i);
    printf("Case %d: %d\n",++ca,d[0]);
}
int main()
{
    while(~scanf("%s",&str))
    {
        trie.init();
        scanf("%d",&S);
        for(int i=0;i<S;++i){scanf("%s",tmp);trie.insert(tmp);}
        solve();
    }
    return 0;
}

 

 

Tire 字典树&& uva1401,布布扣,bubuko.com

Tire 字典树&& uva1401

标签:style   blog   color   for   io   div   

原文地址:http://www.cnblogs.com/wanggp3/p/3832761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!