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 ...
随机推荐
- 大数据学习——HDFS的shell
-help 功能:输出这个命令参数手册 -ls 功能:显示目录信息 示例: hadoop fs -ls hdfs://hadoop-server01:9000/ 备注:这些参数中,所有的hdfs路径都 ...
- [luoguP2015] 二叉苹果树(DP)
传送门 貌似是个树形背包... 好像吧.. f[i][j]表示节点i选条边的最优解 #include <cstdio> #include <cstring> #include ...
- 【区间筛】2017多校训练四 HDU6069 Counting Divisors
http://acm.hdu.edu.cn/showproblem.php?pid=6069 [题意] 给定l,r,k,求 d(n)是n的因子个数 [思路] [Accepted] #include&l ...
- 最大和(codevs 1648)
题目描述 Description N个数围成一圈,要求从中选择若干个连续的数(注意每个数最多只能选一次)加起来,问能形成的最大的和. 输入描述 Input Description 第一行输入N,表示数 ...
- 次最短路径 POJ 3255 Roadblocks
http://poj.org/problem?id=3255 这道题还是有点难度 要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以 关键之处 次短的路径: 设u 到 v的边权重为cost ...
- Hihocoder #1067 : 最近公共祖先·二
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中 ...
- BZOJ1696: [Usaco2007 Feb]Building A New Barn新牛舍
n<=10000个点(xi,yi),找到一个不同于给出的所有点的点,使得该点到所有点的曼哈顿距离最小并找出这样的点的个数. 第一眼看上去这不是中位数嘛,奇数一个点偶数一片,然后找一下这篇区域有几 ...
- POJ3255 Roadblocks 【次短路】
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7760 Accepted: 2848 Descri ...
- Java 8 中的 java.util.Optional
Java 8 中的 java.util.Optional 学习了:https://blog.csdn.net/sun_promise/article/details/51362838 package ...
- Bound mismatch: The typae CertificateDirectory is not a valid substitute for the bounded parameter <M extends Serializable>
这是因为架包没导对或者关联的项目不是在同一个工作空间.