【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\n",++cas,dp[strlen(s)]);
    }
    return 0;
}
时间: 2024-10-15 14:36:58

【LA 3942】 Remember the word的相关文章

【LA 3641】 Leonardo&#39;s Notebook (置换群)

[题意] 给出26个大写字母组成 字符串B问是否存在一个置换A使得A^2 = B [分析] 置换前面已经说了,做了这题之后有了更深的了解. 再说说置换群.   首先是群. 置换群的元素是置换,运算时是置换的连接. 前面已经说了,每个置换都可以写成互不相交的循环的乘积. 然后分析一下这题. 假设A置换是(a1,a2,a3)(b1,b2,b3,b4)   [这里用循环表示 那么A*A=(a1,a2,a3)(b1,b2,b3,b4)(a1,a2,a3)(b1,b2,b3,b4) 不相交的循环满足交换律

【Codeforces 716B】Complete the Word

题目链接 [题解] 当时竟然用线段树做的这题... 遍历每个位置. 看看每个位置开始的26个除了问号的字母有没有重复的. 没有的话就ok. 然后按顺序放每个字母就好 [代码] #include <iostream> #include <cstdio> using namespace std; string s; int temp[100]; void _nextAlpha(char &key,int i){ while (key<='Z' && tem

【LA 3487】Duopoly(图论--网络流最小割 经典题)

题意:一个公司有一些资源,每种只有1割,有A.B两个公司分别对其中一些资源进行分组竞标.问卖资源的公司的最大收益. 解法:最小割.将A公司的竞标与源点相连,B公司的与汇点相连,边容量为竞标价.而A.B公司的竞标中有资源冲突的竞标之间连一条边,容量为INF.这样的最大收益就是 总竞标出价-割去竞标的边的价格的最小值. 问题!!dinic函数那里,我竟然2种打法相差了近乎3秒,也就是dfs函数流了很多次...(?Д?≡?Д?) 1 #include<cstdio> 2 #include<cs

LA 3942 Remember the Word (Trie)

Remember the Word 题目:链接 题意:给出一个有S个不同单词组成的字典和一个长字符串.把这个字符串分解成若干个单词的连接(单词可以重复使用),有多少种方法? 思路:令d[i]表示从字符i开始的字符串(后缀s[i..L])的分解数,这d[i] = sum{d(i+len(x)) | 单词x是其前缀}.然后将所有单词建成一个Trie树,就可以将搜索单词的复杂度降低. 代码: #include<map> #include<set> #include<queue>

【LeetCode OJ】Word Ladder I

Problem Link: http://oj.leetcode.com/problems/word-ladder/ Two typical techniques are inspected in this problem: Hash Table. One hash set is the words dictionary where we can check if a word is in the dictionary in O(1) time. The other hash set is us

LA ——3942 - Remember the Word(Trie 入门)

3942 - Remember the Word Regionals 2007 >> Asia - Nanjing Time limit: 3.000 seconds ------------------------------------------------------ 从右往左地推,令dp[i] 表示字符串  S[i....len]的分解方案数,则dp[i]=sum(dp[i+len(x)])  ,我们只要枚举 S[i....len]的前缀,在所给的单词中查找前缀,如果存在,则进行状态

【总结整理】word使用技巧

Tab+Enter,在编过号以后,会自动编号段落 Ctrl + D调出字体栏,配合Tab+Enter全键盘操作吧 Ctrl + L 左对齐, Ctrl + R 右对齐, Ctrl + E 居中 Ctrl + F查找, Ctrl + H 替换.然后关于替换,里面又大有学问! 有时候Word文档中有许多多余的空行需要删除,这个时候我们可以完全可以用"查找替换"来轻松解决. 打开"编辑"菜单中的"替换"对话框,把光标定位在"查找内容"

【ABAP系列】SAP ABAP DOI展示EXCEL或WORD

公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP DOI展示EXCEL或WORD 前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 DOI技术算是比较老的技术了 用来直接调用office展示结果 可以是EXCEL也可以是WORD ? data: begin of s_fal. include structure faglflext.

【ABAP系列】SAP S/4 HANA的SMARTFORMS如何切换到非word编辑器

公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP S/4 HANA的SMARTFORMS如何切换到非word编辑器 前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 SAP的新版本S/4 HANA系统中,SMARTFORMS里强制使用WORD作为默认编辑器 因为很多人习惯使用SAP里原有的编辑器,所以使用word有些不习惯 实现切换到非word