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

LA3942-Remember the Word(Trie)

时间:2015-08-09 18:32:20      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

题意:

有s个不同的单词,给出一个长字符串把这个字符串分解成若干个单词的连接(可重复使用),有多少种分解方法

分析:

dp[i]表示i开始的字符串能分解的方法数 dp[i]=sum(dp[i+len(x)]);单词x是i开始的字符串的前缀。

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
#define maxnode 500000
const ll  INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod =  20071027;
int dp[maxnode];
struct Trie{
    int ch[maxnode][27];
    int val[maxnode];
    int num;
    void init(){num=1;memset(ch[0],0,sizeof(ch[0]));}
    int idx(char c){
        return c-a;
    }
    void build(char *s,int v){
        int u=0,n=strlen(s);
        for(int i=0;i<n;++i){
            int c=idx(s[i]);
            if(!ch[u][c]){
                memset(ch[num],0,sizeof(ch[num]));
                val[num]=0;
                ch[u][c]=num++;
            }
            u=ch[u][c];
        }
        val[u]=v;
    }
    int query(char *s,int st){
        int u=0,sum=0,n=strlen(s);
        for(int i=st;i<n;++i)
        {
            int c=idx(s[i]);
            u=ch[u][c];
            if(u==0)return sum;
            if(val[u]){
                sum+=dp[i+1];
                sum%=mod;
            }
        }
        return sum;
    }
}trie;
int main()
{
    char str[4010],str1[110];
    int m;
    while(~scanf("%s",str)){
        scanf("%d",&m);
        trie.init();
        for(int i=0;i<m;++i){
            scanf("%s",str1);
            trie.build(str1,1);
        }
        memset(dp,0,sizeof(dp));
        int len=strlen(str);
        dp[len]=1;
        for(int i=1;i<=len;++i)
            dp[len-i]=trie.query(str,len-i);
            printf("%d\n",dp[0]);
    }
return 0;
}

 

LA3942-Remember the Word(Trie)

标签:

原文地址:http://www.cnblogs.com/zsf123/p/4715533.html

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