Neal is very curious about combinatorial problems, and now here comes a problem about words. Knowing

that Ray has a photographic memory and this may not trouble him, Neal gives it to Jiejie.

Since Jiejie can’t remember numbers clearly, he just uses sticks to help himself. Allowing for Jiejie’s

only 20071027 sticks, he can only record the remainders of the numbers divided by total amount of

sticks.

The problem is as follows: a word needs to be divided into small pieces in such a way that each

piece is from some given set of words. Given a word and the set of words, Jiejie should calculate the

number of ways the given word can be divided, using the words in the set.

Input

The input file contains multiple test cases. For each test case: the first line contains the given word

whose length is no more than 300 000.

The second line contains an integer S, 1 ≤ S ≤ 4000.

Each of the following S lines contains one word from the set. Each word will be at most 100

characters long. There will be no two identical words and all letters in the words will be lowercase.

There is a blank line between consecutive test cases.

You should proceed to the end of file.

Output

For each test case, output the number, as described above, from the task description modulo 20071027.

Sample Input

abcd

4

a

b

cd

ab

Sample Output

Case 1: 2


题意##

给定一个由S个单词组成的字典和一个字符串,求将这个字符串分解为若干单词的连接有多少种分法。


想法一##

进行dp

dp[i]表示字符串从第i位往后有多少种分法

转移方程: dp[i]=sum { dp[j+1] | s[i~j]为一个单词 }

枚举每一个单词

复杂度 每一组数据Θ(len(s)·S)

略微有那么一点高

想法二##

还是dp,转移方程同上

一个个枚举单词太慢了,我们发现对某一个i所有可以的单词前缀都应相同

运用数据结构trie

从s[i]开始在trie上找,找到某一个单词的结束就相当于找到了一个j

复杂度 每一组数据Θ(maxlen(字典中的单词)·S)

这样就可以过啦


代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring> using namespace std; const int N = 300005;
const int P = 20071027; struct trie{
trie *ch[26];
int flag;
void clear(){
flag=0;
for(int i=0;i<26;i++) ch[i]=NULL;
}
}pool[105*4000],*root;
int cnt; int d[N];
void add(){
char s[105];
scanf("%s",s);
int len=strlen(s),id;
trie *p=root;
for(int i=0;i<len;i++){
id=s[i]-'a';
if(!p->ch[id]){
pool[++cnt].clear();
p->ch[id]=&pool[cnt];
}
p=p->ch[id];
}
p->flag++;
} char sh[N]; int main()
{
int len,n,i,j,kase=0;
trie *p;
root=&pool[++cnt];
while(scanf("%s",sh)!=EOF){
len=strlen(sh);
scanf("%d",&n);
pool[1].clear(); cnt=1;
for(i=0;i<n;i++) add();
d[len]=1;
for(i=len-1;i>=0;i--){
p=root;
d[i]=0;
for(j=i;j<len;j++){
if(p->ch[sh[j]-'a']) {
p=p->ch[sh[j]-'a'];
if(p->flag)
d[i]=(d[i]+d[j+1])%P;
}
else break;
}
}
printf("Case %d: %d\n",++kase,d[0]);
} return 0;
}

Uva1014:Remember the Word的更多相关文章

  1. Word/Excel 在线预览

    前言 近日项目中做到一个功能,需要上传附件后能够在线预览.之前也没做过这类似的,于是乎就查找了相关资料,.net实现Office文件预览大概有这几种方式: ① 使用Microsoft的Office组件 ...

  2. C#中5步完成word文档打印的方法

    在日常工作中,我们可能常常需要打印各种文件资料,比如word文档.对于编程员,应用程序中文档的打印是一项非常重要的功能,也一直是一个非常复杂的工作.特别是提到Web打印,这的确会很棘手.一般如果要想选 ...

  3. C# 给word文档添加水印

    和PDF一样,在word中,水印也分为图片水印和文本水印,给文档添加图片水印可以使文档变得更为美观,更具有吸引力.文本水印则可以保护文档,提醒别人该文档是受版权保护的,不能随意抄袭.前面我分享了如何给 ...

  4. 获取打开的Word文档

    using Word = Microsoft.Office.Interop.Word; int _getApplicationErrorCount=0; bool _isMsOffice = true ...

  5. How to accept Track changes in Microsoft Word 2010?

    "Track changes" is wonderful and remarkable tool of Microsoft Word 2010. The feature allow ...

  6. C#将Word转换成PDF方法总结(基于Office和WPS两种方案)

    有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有的格式和图片.一个比较好的办法就是将word转换成pdf,然 ...

  7. 开源Word读写组件DocX 的深入研究和问题总结

    一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...

  8. [.NET] 开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc

    开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc [博主]反骨仔 [原文地址]http://www.cnblogs.com/li ...

  9. C# Word中设置/更改文本方向

    C# Word中设置/更改文本方向 一般情况下在Word中输入的文字都是横向的,今天给大家分享两种方法来设置/更改一个section内的所有文本的方向及部分文本的方向,有兴趣的朋友可以试下. 首先,从 ...

随机推荐

  1. vue element UI el-table 表格调整行高的处理方法

    这是我在工作项目中遇到的问题,我想将标记处下方的表格高度调低一点,也就是想实现下面的这个效果: 代码调整如下: 说明: 缩小:行高到一定程度之后便不能缩小. 好像最小35px.各位可以试一下. 升高: ...

  2. 1134 最长上升子序列 (序列型 DP)

    思路: 由于一般的动态规划时间复杂度是O(n^2)(哈哈哈哈 第一次用的就是这个!)用在这里由于n最大为50000 所以会超时 到这里我们可以用一个数组来动态维护这个最长上升的子序列,将你要输入的子序 ...

  3. HashMap深入理解

    Map 的实现类有 HashMap.LinkedHashMap.TreeMap.IdentityHashMap.WeakHashMap.Hashtable.Properties 等等. 关于 Hash ...

  4. Vue 扩展插件

  5. CKEditor配置,最适合新手两种方式详解。

    CKEditor.js的配置,大概有两种方式,这里有基础版和全面的版本可以试验 https://cdn.ckeditor.com/4.8.0/full-all/ckeditor.js http://c ...

  6. es6笔记 day4---模块化

    模块化: 注意:需要放到服务器环境 1.如何定义模块? export  东西 export   const a = 12; export { a  as  aaa, b  as  banana } 2 ...

  7. Docker 安装nginx 与端口映射

    1. 拉取镜像(网易云docker镜像仓库) docker pull hub.c.163.com/library/nginx:latest 2. 运行nignx,并做端口映射 -d 后台运行  -p映 ...

  8. 【k8s】kubeadm快速部署Kubernetes

    1.Kubernetes 架构图 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Mast ...

  9. 第二阶段:2.商业需求分析及BRD:7.商业需求文档3

    BRD模版 阐述需求来源以及调研分析情况 百度指数工具.定量的数据.发展趋势,是否与公司的战略冲突.环境政策:比如做内容的运营. 决策层看重的! 第二大块. 通过什么方式解决这个需求. 规划能力.类似 ...

  10. MySQL性能优化:MySQL中的隐式转换造成的索引失效

    数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很 ...