Remember the Word,LA3942(Trie树+DP)

Trie树基础题,记录下代码。

#include <cstdio>
#include <cstring>

#define MaxNode 4005*100
#define NodeSize 26
#define MOD 20071027

char givenword[300005];
int ans[300005];
int next[MaxNode][NodeSize];
class Trie{
    public:
        int val[MaxNode];
        int sz;
        Trie(){
            sz = 1;     //初始时有一个根结点
            memset(next[0], 0, sizeof(next[0]));
        }
        int idx(char ch){
            return ch - 'a';
        }
        void insert(char *s, int v){
            int len = strlen(s);
            int d = 0;
            for(int i = 0; i < len; ++i){
                int _idx = idx(s[i]);
                if(!next[d][_idx]){
                    memset(next[sz],0,sizeof(next[sz]));
                    val[sz] = 0;
                    next[d][_idx] = sz++;
                }
                d = next[d][_idx];
            }
            val[d] = v;
        }
        void query(char *s,int pos){
            int len = strlen(s);
            int d = 0;
            for(int i = 0; i < len; ++i){
                int _idx = idx(s[i]);
                if(!next[d][_idx])  return;
                d = next[d][_idx];
                if(val[d]){
                    ans[pos] += ans[pos+i+1];
                    if(ans[pos] > MOD) ans[pos] -= MOD;
                }
            }
            return;
        }
};

int main()
{
    int S;
    int Case = 1;
    while(scanf("%s",givenword)!=EOF){
        int len = strlen(givenword);
        memset(ans,0,(len+1)*sizeof(int));
        ans[len] = 1;
        scanf("%d",&S);
        char tstr[105];
        Trie trie;
        for(int i = 0;i < S;++i){
            scanf("%s",tstr);
            trie.insert(tstr,1);
        }
        for(int i = len-1; i >= 0; --i){
            trie.query(&givenword[i],i);
        }
        printf("Case %d: ",Case++);
        printf("%d\n",ans[0]);
    }
    return 0;
}

Remember the Word,LA3942(Trie树+DP)

时间: 2024-11-05 15:58:19

Remember the Word,LA3942(Trie树+DP)的相关文章

[POJ 1204]Word Puzzles(Trie树暴搜)

Description Word puzzles are usually simple and very entertaining for all ages. They are so entertaining that Pizza-Hut company started using table covers with word puzzles printed on them, possibly with the intent to minimise their client's percepti

[POJ 1204]Word Puzzles(Trie树暴搜&amp;amp;AC自己主动机)

Description Word puzzles are usually simple and very entertaining for all ages. They are so entertaining that Pizza-Hut company started using table covers with word puzzles printed on them, possibly with the intent to minimise their client's percepti

UVALive - 3942 - Remember the Word (Trie树)

UVALive - 3942 Remember the Word Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Neal is very curious about combinatorial problems, and now here comes a problem about words. Knowing that Ray has a p

LA 3942 Remember the Word (Trie树)

——刘汝佳的白皮书里面介绍的题目. /* Problem: Status : By WF, */ #include "algorithm" #include "iostream" #include "cstring" #include "cstdio" #include "string" #include "stack" #include "cmath" #inclu

LA 3942 - Remember the Word (字典树 + dp)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1943 题目大意: 给定一个字符串和给定一个单词集合.问从给定单词集合中选取单词,有多少种选取方法刚好拼接成字符串. 例如: abcd 4 a b cd ab 有两种 a-b-cd ab-cd 这两种情况 解题思路: 因为给定的字符串的长度是3*10^5所以暴力就不能解决问题了

uvaliva3942(trie树)

题目连接:https://vjudge.net/problem/UVALive-3942 trie树 dp[i]=sum(dp[i+len(x)]%mod; dp[i]表示从字符i开始的字符串的分解方案方案数,x是s[i--L]的前缀 1 #include<cstdio> 2 #include<cstring> 3 const int maxnode=500010; 4 const int sigma=26; 5 const int N=300010; 6 const int mo

UVALive 3942 Remember the Word 字典树+dp

/** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5)和m个单词(每个单词长度最多100).单词都是不同的.该字符串可以由若干个单词组成,问最多有多少种组合方式. 思路:字典树+dp 用字典树处理好m个单词,定义dp[i]表示从i开始的字符串可以由单词组成的方式数. 那么dp[i] += dp[i+j]; j表示某个单词和字符串的[i,i+j-1]匹配

HNU 13108 Just Another Knapsack Problem DP + Trie树优化

题意: 给你一个文本串,和一些模式串,每个模式串都有一个价值,让你选一些模式串来组成文本串,使获得的价值最大.每个模式串不止能用一次. 思路: 多重背包,枚举文本串的每个位置和模式串,把该模式串拼接在当前位置,看下一个位置是否能得到更优值.但是,存在很多模式串不能拼在当前位置的,无效状态.所以可以用Trie树来优化转移. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <c

【状压dp】Trie 树 @中山纪念中学20170304

目录 Trie 树 PROBLEM 题目描述 输入 输出 样例输入 样例输出 SOLUTION CODE Trie 树 PROBLEM 题目描述 字母(Trie)树是一个表示一个字符串集合中所有字符串的前缀的数据结构,其有如下特征: 1.树的每一条边表示字母表中的一个字母 2.树根表示一个空的前缀 3.树上所有其他的节点都表示一个非空前缀,每一个节点表示的前缀为树 根到该节点的路径上所有字母依次连接而成的字符串. 4.一个节点的所有出边(节点到儿子节点的边)中不存在重复的字母. 现在Matej手