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)的更多相关文章

  1. UVA 3942 Remember the Word (Trie+DP)题解

    思路: 大白里Trie的例题,开篇就是一句很容易推出....orz 这里需要Trie+DP解决. 仔细想想我们可以得到dp[i]=sum(dp[i+len[x]]). 这里需要解释一下:dp是从最后一 ...

  2. UVALive - 3942 Remember the Word (Trie + DP)

    题意: 给定一篇长度为L的小写字母文章, 然后给定n个字母, 问有多少种方法用这些字母组成文章. 思路: 用dp[i]来表达[i , L]的方法数, 那么dp[i] 就可以从dp[len(x) + i ...

  3. UVA 1401 Remember the Word(用Trie加速动态规划)

    Remember the Word Neal is very curious about combinatorial problems, and now here comes a problem ab ...

  4. UVa 1220 - Party at Hali-Bula(树形DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. 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) ...

  6. UVa 11400 - Lighting System Design(线性DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. UvaLive3942(Trie + dp)

    查了半天数组越界的RE,才发现自己把ch数组放结构体里是过大的……放全局就A了. 类似区间的dp比较显然,只是用trie树做了优化,使得可以在trie树里一边走一边往上加dp值,不必枚举以前的每个位置 ...

  8. UVa 11270 铺放骨牌(轮廓线DP)

    https://vjudge.net/problem/UVA-11270 题意: 用1×2骨牌覆盖n×m棋牌,有多少种方法? 思路: 这道题目是典型的轮廓线DP题. 所谓轮廓线DP,就是以整行整列为状 ...

  9. 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 ...

随机推荐

  1. Selenium加载Chrome/Firefox浏览器配置文件

    Selenium启动浏览器时,默认是打开一个新用户,不会加载原有的配置以及插件.但有些时候我们可能需要加载默认配置. 一.Chrome浏览器 1.在Chrome浏览器的地址栏输入:chrome://v ...

  2. 大数据学习——linux常用命令(五)

    1 挂载外部存储设备 可以挂载光盘.硬盘.磁带.光盘镜像文件等 1/ 挂载光驱 mkdir   /mnt/cdrom      创建一个目录,用来挂载 mount -t iso9660 -o ro / ...

  3. xtu字符串 D. 病毒侵袭

    D. 病毒侵袭 Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class nam ...

  4. BNU 4346 Scout YYF I

    A. Scout YYF I Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java cla ...

  5. Git上传的使用步骤

    Git上传的使用步骤 首先 git branch 查看当前的分支是否为本地自己分支 接着 git stash 保存本地自己的保存 git checkout earemote 查看本地共有开发分支 gi ...

  6. HDU 1874 最直接的最短路径问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...

  7. OC-category 为什么不能添加成员变量

    以下的答案是百度的,仅做记录而已: 1. 利用运行时实际上也不是添加成员变量.已编译的类的内存布局是不变的,Class就是一个结构体,里面的成员不能改变.但是通过运行时可以将一个对象或基础类型变成指定 ...

  8. mybatis几种开发方式

    mybatis是比较轻巧的半自动化的CRM框架,它有几种开发方式,现今张列于此: 一.注解方式:在接口方法上面写SQL语句,有点类似springdataJPA 的query sql 语句 范例 @se ...

  9. Ubuntu更换主板之后 网络重新配置

    Ubuntu更换主板之后,网络不能用,需要重新配置 1.  首要要查看新主板的mac地址, dmesg | grep eth 2.  修改网络信息,该配置文件是/etc/udev/rules.d, 文 ...

  10. HadoopMapReduce运行机制

    1.map方法读取一个文件的一行记录进行分析,  输入:LongWritable(当前读取的文件位置), Text(内容) 2.map将读取到的信息进行分类,输入Context  (键值对)  ;作为 ...