zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    分解质因数
    记忆化搜索
    BFS(广度优先搜索)
    DFS(深度优先搜索)
    A*算法
    最小生成树
    最近公共祖先(LCA)问题
    k短路算法
    次短路问题
    拓扑排序
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/7141325.html
Copyright © 2011-2022 走看看