UVA - 1401 Remember the Word(trie+dp)
1、给一个串,在给一个单词集合,求用这个单词集合组成串,共有多少种组法。
例如:串 abcd, 单词集合 a, b, cd, ab
组合方式:2种:
a,b,cd
ab,cd
2、把单词集合建立字典树,然后从后向前dp,dp[i]=dp[i]+dp[i+len(x)]; 其中x为当前找到的前缀长度。
3、
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; #define MAX 26
#define MOD 20071027 int dp[]; struct Trie
{
Trie *next[MAX];
int v; //根据需要变化,1代表无此单词,-1代表有此单词
};
Trie *root; void createTrie(char *str)
{
int len = strlen(str);
Trie *p = root, *q;
for(int i=; i<len; ++i)
{
int id = str[i]-'a';
if(p->next[id] == NULL)
{
// q = (Trie *)malloc(sizeof(Trie));
q = new Trie;
q->v = ; //初始v==1
for(int j=; j<MAX; ++j)
q->next[j] = NULL;
p->next[id] = q;
}
p = p->next[id];
}
p->v = -; //若为结尾,则将v改成-1表示
}
int findTrie(char *str,int mI,int len)
{
int ret=;
//int len = strlen(str);//每次都计算,很浪费时间
Trie *p = root;
for(int i=mI; i<len; ++i)
{
int id = str[i]-'a';
p = p->next[id];
if(p == NULL) //若为空集,表示不存以此为前缀的串
return ret;
if(p->v == -){ //字符集中已有串是此串的前缀
ret=(ret+dp[i+])%MOD;
}
}
return ret;
}
int deleteTrie(Trie* T)
{
int i;
if(T==NULL)
return ;
for(i=; i<MAX; i++)
{
if(T->next[i]!=NULL)
deleteTrie(T->next[i]);
}
//free(T);
delete(T);
return ;
}
int main()
{
char str[];
char str2[];
int i,S,len,mCase=;
while(~scanf("%s",str)){
root=new Trie;
for(i=; i<MAX; i++)
root->next[i]=NULL;
memset(dp,,sizeof(dp));
len=strlen(str);
scanf("%d",&S);
while(S--){
scanf("%s",str2);
createTrie(str2);
} dp[len]=;
for(i=len-;i>=;--i)
dp[i]=findTrie(str,i,len); printf("Case %d: %d\n",++mCase,dp[]);
delete(root);
}
return ;
}
UVA - 1401 Remember the Word(trie+dp)的更多相关文章
- UVA 3942 Remember the Word (Trie+DP)题解
思路: 大白里Trie的例题,开篇就是一句很容易推出....orz 这里需要Trie+DP解决. 仔细想想我们可以得到dp[i]=sum(dp[i+len[x]]). 这里需要解释一下:dp是从最后一 ...
- UVALive - 3942 Remember the Word (Trie + DP)
题意: 给定一篇长度为L的小写字母文章, 然后给定n个字母, 问有多少种方法用这些字母组成文章. 思路: 用dp[i]来表达[i , L]的方法数, 那么dp[i] 就可以从dp[len(x) + i ...
- UVA 1401 Remember the Word(用Trie加速动态规划)
Remember the Word Neal is very curious about combinatorial problems, and now here comes a problem ab ...
- UVa 1220 - Party at Hali-Bula(树形DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 12063 Zeros and Ones(三维dp)
题意:给你n.k,问你有多少个n为二进制的数(无前导零)的0与1一样多,且是k的倍数 题解:对于每个k都计算一次dp,dp[i][j][kk][l]表示i位有j个1模k等于kk且第一位为l(0/1) ...
- UVa 11400 - Lighting System Design(线性DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UvaLive3942(Trie + dp)
查了半天数组越界的RE,才发现自己把ch数组放结构体里是过大的……放全局就A了. 类似区间的dp比较显然,只是用trie树做了优化,使得可以在trie树里一边走一边往上加dp值,不必枚举以前的每个位置 ...
- UVa 11270 铺放骨牌(轮廓线DP)
https://vjudge.net/problem/UVA-11270 题意: 用1×2骨牌覆盖n×m棋牌,有多少种方法? 思路: 这道题目是典型的轮廓线DP题. 所谓轮廓线DP,就是以整行整列为状 ...
- UVA - 11488 Hyper Prefix Sets(trie树)
1.给n个只含0.1的串,求出这些串中前缀的最大和. 例1: 0000 0001 10101 010 结果:6(第1.2串共有000,3+3=6) 例2: 01010010101010101010 1 ...
随机推荐
- hexo干货系列:(八)hexo文章自动隐藏侧边栏
前言 使用Jacman主题的时候发现打开具体文章后,侧边栏还是会展示,我想要的效果是自动隐藏侧边栏,并且展示目录.但是当我修改了主题配置文件里面close_aside属性为true的时候,发现侧边栏隐 ...
- [USACO10FEB]慢下来Slowing down
线段树 树的dfs序 来自 洛谷 P1982 的翻译 by GeneralLiu 来自 jzyz 的翻译 %mzx 线段树 dfs序 数据结构的应用 “数据结构 是先有需求 再有应用” ...
- [luoguP1947] 笨笨当粉刷匠_NOI导刊2011提高(10)(DP)
传送门 f[i][j][k]表示前i行,最后一行前j个,选k次最优解 ntr[i][j][2]表示当前行区间i~j涂0或1所能刷的正确格子 #include <cstdio> #defin ...
- java Web项目Service层通用接口和entityVo对象与entity对象转化问题的解决方案
Service层的接口中有一些比较常用方法,一次又一次的在新的Service层中被书写,所以懒惰的程序员又烦了,他们决定写个通用接口来解决这个问题. 有些项目中,实体类即承担接收表单数据的任务,又承担 ...
- 微软2016校园招聘在线笔试 B Professor Q's Software [ 拓扑图dp ]
传送门 题目2 : Professor Q's Software 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new s ...
- msp430项目编程10
msp430中项目---电子密码锁 1.扫描键盘工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- JavaScript 将行结构数据转化为树结构数据源(高效转化方案)
js接收到后台的数据如下 /// 部门信息 var departRows = [{ parentDepartId: 'root', departId: 'DC', departName: '集团' } ...
- 2015轻院校赛 D 社交网络(排列组合)
http://acm.zznu.edu.cn/problem.php?id=1964 题目描述 输入 输出 样例输入 2 2 1 0 1 1 0 3 1 0 1 1 1 0 1 1 1 0 样例输出 ...
- [Bzoj2286][Sdoi2011]消耗战(虚树模板题附讲解)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4896 Solved: 1824[Submit][Statu ...
- [CERC2015]Digit Division
题目描述 We are given a sequence of n decimal digits. The sequence needs to be partitioned into one or m ...