【LA 3942】 Remember the word

题意

给定一个字符串和若干个单词,询问能把字符串分解成这些单词的方案数。比如abcd ,有单词a,b,ab,cd:就可以分解成a+b+cd或者ab+cd。

分析

trie树—>DP

代码

(感谢qrc巨神的细心指导,并不是很细心的我竟然也AC了,qrc太巨了!)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MNODE 400000
#define mod 20071027
int trie[MNODE][26],cntnode;
bool tag[MNODE];
int dp[300005];
void init(int x,char *s,int i){
    if(i==strlen(s)) {tag[x]=1;return;}
    char c=s[i];
    if(!trie[x][c-'a']) trie[x][c-'a']=++cntnode;
    init(trie[x][c-'a'],s,i+1);
}
int main(){
    char s[300005];
    int S;
    int cas=0;
    while(scanf("%s",s)!=EOF){
        memset(trie,0,sizeof(trie));
        memset(tag,0,sizeof(tag));
        cntnode=1;
        scanf("%d",&S);
        char ss[101];
        while(S--) scanf("%s",ss),init(1,ss,0);
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(int i=0;i<strlen(s);i++){
            int now=1;
            for(int j=i;j<strlen(s);j++){
                if(trie[now][s[j]-'a']) now=trie[now][s[j]-'a'];
                else break;
                if(tag[now]) dp[j+1]=(dp[j+1]+dp[i])%mod;
            }
        }
        printf("Case %d: %d
",++cas,dp[strlen(s)]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/PaperCloud/p/7141325.html