http://acm.hust.edu.cn/vjudge/problem/22109

题意:给定n个单词,一个字符串,问把这个字符串划分为若干个单词的连接(单词可重复使用)有多少种方案(mod20071027)。

题解:

设d[i]为从第i个字母开始的后缀有多少种匹配方案。
if 单词x是当前后缀的前缀: d[i]=sum{d(i+len(x))}

用所有单词建一棵trie,从后往前循环i,对于每一个i进入trie查找前缀,更新d[i]。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. using namespace std;
  6.  
  7. const int L=,Mod=;
  8. char s0[L],s[L];
  9. int n,num;
  10. int d[L],ch[L][],bk[L];
  11.  
  12. void insert(char *c)
  13. {
  14. int l=strlen(c);
  15. int x=;
  16. for(int i=;i<l;i++)
  17. {
  18. int id=c[i]-'a'+;
  19. if(!ch[x][id])
  20. {
  21. num++;
  22. ch[x][id]=num;
  23. }
  24. x=ch[x][id];
  25. }
  26. bk[x]=l;
  27. }
  28.  
  29. void find(int l,int r)
  30. {
  31. int x=;
  32. for(int i=l;i<=r;i++)
  33. {
  34. int id=s0[i]-'a'+;
  35. if(!ch[x][id]) break;
  36. x=ch[x][id];
  37. if(bk[x]) d[l]=(d[l]+d[l+bk[x]])%Mod;
  38. }
  39. }
  40.  
  41. //d[i]=sum(d[i]+len(x))
  42. int main()
  43. {
  44. freopen("a.in","r",stdin);
  45. freopen("a.out","w",stdout);
  46. int T=;
  47. while(scanf("%s",s0)!=EOF)
  48. {
  49. num=;
  50. memset(bk,,sizeof(bk));
  51. memset(ch,,sizeof(ch));
  52. memset(d,,sizeof(d));
  53. scanf("%d",&n);
  54. for(int i=;i<=n;i++)
  55. {
  56. scanf("%s",s);
  57. insert(s);
  58. }
  59. int l=strlen(s0);
  60. d[l]=;
  61. for(int i=l-;i>=;i--) find(i,l-);
  62. // for(int i=0;i<l;i++) printf("%d ",d[i]);printf("\n");
  63. printf("Case %d: %d\n",++T,d[]%Mod);
  64. }
  65.  
  66. return ;
  67. }

【LA3942-Remember the word 】Trie的更多相关文章

  1. 【hiho一下 第四周】Trie图

    [题目链接]:http://hihocoder.com/problemset/problem/1036?sid=1092555 [题意] [题解] AC自动机的模板题; 在求有没有子串的时候; 注意要 ...

  2. 【hiho一下第二周 】Trie树

    [题目链接]:http://hihocoder.com/problemset/problem/1014 [题意] [题解] 在字典树的域里面加一个信息cnt; 表示这个节点下面,记录有多少个单词; 在 ...

  3. 【Length of Last Word】cpp

    题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...

  4. 【jacob word】使用jacob,合并多个word为一个word文件

    将几个word文件合并到一个word文件,使用注意点: 1.后面附项目运用的jar包jacob-1.9, 2.并且jacob运用中,需要将附件内的jacob.dll放到windows/system32 ...

  5. 【LeetCode-面试算法经典-Java实现】【058-Length of Last Word (最后一个单词的长度)】

    [058-Length of Last Word (最后一个单词的长度)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a string s consis ...

  6. 在Winform界面菜单中实现动态增加【最近使用的文件】菜单项

    在我们一些和文件处理打交道的系统中,我们往往需要记录下最近使用的文件,这样方便用户快速打开之前浏览或者编辑过的文件,这种在很多软件上很常见,本文主要介绍在Winform界面菜单中实现[最近使用的文件] ...

  7. 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货

    关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...

  8. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  9. 【Linux探索之旅】第一部分第五课:Unity桌面,人生若只如初见

    内容简介 1.第一部分第五课:Unity桌面,人生若只如初见 2.第一部分第六课预告:Linux如何安装在虚拟机中 Unity桌面,人生若只如初见 不容易啊,经过了前几课的学习,我们认识了Linux是 ...

随机推荐

  1. maven学习手记 - 3

    学习目标 maven插件的定义: maven插件的使用.   前言 在手记2中说过maven的阶段命令是通过插件实现的.在手记1中也有简单的示范过插件的用法.但是总觉得有些泛泛了,想在这里再捋一下,以 ...

  2. C# 发送邮件实例

    一.发送者首先要开启smtp服务,如QQ: 首先点QQ头像旁边的信封符号进入邮箱.   进入邮箱后点击顶部的设置按钮 3 点击二级目录“账户” 拉到中下部 把这两项勾上 4 点击保存 二.编辑代码,如 ...

  3. EntityFramwork(1) 源地址https://msdn.microsoft.com/zh-cn/data/jj193542

    1.创建应用程序 简单起见,我们将构建一个使用 Code First 执行数据访问的基本控制台应用程序. 打开 Visual Studio "文件"->"新建&qu ...

  4. [SSH服务]——SSH详解、常用的远程连接工具

    在总结ssh原理前,我先做了一个ssh过程的实验 首先我搭建了这样一个实验环境: (1) SSH Server:10.0.10.198 (2) SSH Client:10.0.10.158 在Serv ...

  5. Material

    renderer.material  物理材质 实现二维图上的人物动作 新建Material,选择Shader(著色器)为transparent/diffuse(背景透明),将上图拉到背景图选项中. ...

  6. TF-IDF与余弦相似性的应用(一):自动提取关键词

    这个标题看上去好像很复杂,其实我要谈的是一个很简单的问题. 有一篇很长的文章,我要用计算机提取它的关键词(Automatic Keyphrase extraction),完全不加以人工干预,请问怎样才 ...

  7. 关于myeclipse代码提示的一些问题

    默认是  .xxx  输入点提示,要写注释 @xxx的时候怎么输入@后面有代码提示呢? Auto activation delay 是代码提示出现的速度  下面一行是出现代码提示的条件 我们在.后面加 ...

  8. Visual Studio 2013

    1.How to hide reference counts in VS2013? Tools--> Options --> Text Editor --> All Language ...

  9. BZOJ 2653 middle

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题目大意:多组询问,求左右端点在规定范围内移动所能得到的最大中位数. [分析] 求中 ...

  10. 2014ACM/ICPC亚洲区牡丹江站 浙大命题

    A  Average Score http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5373 a班有n个人,b班有m个人,bob在a ...