UVALive 3942 字典树+dp
其实主要是想学一下字典树的写法,但这个题目又涉及到了DP;
这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到。
其实就是通过递推,从1扫到最后一位,由d[i]代表1-i位的时候的组合总数,则对d[i]进行扩张,凡是可以从第i+1位到第j位正好对应一个单词,则,d[j]+=d[i];
这样递推完,d[len]即为最后结果
为了表示某个单词的结尾,在字典树中再加一个变量 flag,当单词结尾的时候为1,否则为0,这样只要在树种读到了flag=1的时候,即表示读到这个单词。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node
{
node* ch[];
bool flag;
} tree[];
int cnt,len,d[];
const int MOD=;
node* creat()
{
node*p;
p=&tree[cnt++];
for (int i=; i<; i++)
p->ch[i]=NULL;
p->flag=false;
return p;
}
char s[];
char tmp[];
int ok[];
int num;
void insertn(node* root,char*s1)
{
node* p=root;
int i=;
while (s1[i])
{
int k=s1[i++]-'a';
if (p->ch[k]==NULL)
{
p->ch[k]=creat();
}
p=p->ch[k];
}
p->flag=true;
}
void chk(int add,int jmp,node* root)
{
node* p=root;
for (int i=jmp;i<=len;i++)
{
if (p->ch[s[i]-'a']!=NULL)
{
p=p->ch[s[i]-'a'];
if (p->flag)
{
d[i]=(d[i]+add)%MOD;
ok[i]=;
}
}
else break;
}
}
int main()
{
int kase=;
while (scanf("%s",s+)!=EOF)
{
cnt=;
scanf("%d",&num);
node* root=creat();
for (int i=; i<num; i++)
{
scanf("%s",tmp);
//puts(tmp);
insertn(root,tmp);
}
len=strlen(s+);
//cout<<len<<endl;
memset(d,,sizeof d);
memset(ok,,sizeof ok);
d[]=;
ok[]=;
for (int i=;i<=len;i++)
{
if (ok[i-])
chk(d[i-],i,root);
}
printf("Case %d: %d\n",++kase,d[len]);
}
return ;
}
UVALive 3942 字典树+dp的更多相关文章
- UVALive 3942 Remember the Word 字典树+dp
/** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5) ...
- Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp
C. Spy Syndrome 2 题目连接: http://www.codeforces.com/contest/633/problem/C Description After observing ...
- LA 3942 - Remember the Word (字典树 + dp)
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- HDU5715 XOR 游戏 二分+字典树+dp
当时Astar复赛的时候只做出1题,赛后补题(很长时间后才补,懒真是要命),发现这是第二简单的 分析: 这个题,可以每次二分区间的最小异或和 进行check的时候用dp进行判断,dp[i][j]代表前 ...
- Codeforces Round #311 (Div. 2) E - Ann and Half-Palindrome(字典树+dp)
E. Ann and Half-Palindrome time limit per test 1.5 seconds memory limit per test 512 megabytes input ...
- BZOJ 4260 Codechef REBXOR (区间异或和最值) (01字典树+DP)
<题目链接> 题目大意:给定一个序列,现在求出两段不相交的区间异或和的最大值. 解题分析: 区间异或问题首先想到01字典树.利用前缀.后缀建树,并且利用异或的性质,相同的两个数异或变成0, ...
- CF456D A Lot of Games (字典树+DP)
D - A Lot of Games CF#260 Div2 D题 CF#260 Div1 B题 Codeforces Round #260 CF455B D. A Lot of Games time ...
- UVALive 5029 字典树
E - Encoded Barcodes Crawling in process...Crawling failedTime Limit:3000MS Memory Limit:0KB 6 ...
- UVALive 4685 Succession 树DP+背包
一.前言 这道题同样来自于红书P142,作为树DP专题中的一道比较难的题目,A了一天左右的时间,看上去事实证明,这题的难度理我本身的实力还是有些太远了,于是正确的做法应该是分析一下题目之后进行解析什么 ...
随机推荐
- 6.安装telnet服务
yum list telnet* 列出telnet相关的安装包 yum install telnet-server 安装telnet服务 yum install telnet.* 安装telnet客户 ...
- 格雷码(Grey Code)生成规则
(1) Grey码在FPGA实际应用中是实用的码,在8421BCD码累加计数器中,如果寄存器需要发生多位(两位或者以上)的跳变,会出现中间态,这样作为组合逻辑的输入是不稳妥的. 下面看两个中间态的例子 ...
- java分词技术(自动提取关键词,段落大意)hanlp
这是老师大作业需要的技术才知道hanlp这个外部包 使用方法 包以及数据如下GIT下载很慢我传百度云了 链接:https://pan.baidu.com/s/14a22v1g_CAQN-G-k8 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-file
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 基于 Annotation 的装配(注解)
注解:就是一个类,使用@注解名称 开发中:使用注解 取代 xml配置文件. 1. @Component取代<bean class=""> @Component(&quo ...
- UVA - 12174 Shuffle (预处理+滑动窗口)
题意:已知歌单中的歌曲数目s,和部分的播放历史,问下一首可能播放的歌曲种数. 分析: 1.按照歌单数目s,将播放历史划分为几部分. 2.将播放历史的n首歌曲之前加上s首歌曲,之后加上s首歌曲,为防止标 ...
- C++ Socket WSAENOBUFS WSAoverlapped
WSARecv的时候,投递的接收缓冲区的大小设置为0. 然后手动调用非阻塞recv从缓冲区接受数据,直到WSAEWOULDBLOCK,不然会有很多的buffer被锁住,当客户端的数量达到一定数目时,就 ...
- springboot启动总是启动不起来UnsatisfiedDependencyException异常
采用debug模式启动总是停留在 点击后: 鼠标放在ex上: org.springframework.beans.factory.UnsatisfiedDependencyException: Err ...
- @echo off命令
在C盘下新建一个文本文档,将名字改为1.bat. 打开/编辑,输入call cmd.cmd是命令提示符.运行该文件,出现命令提示符窗口,在该窗口下可以运行各种命令.由图1.1可见,在第一行显示C:\ ...
- 069-PHP数组下标
<?php $arr=array(98,'hello',67,'A',85,NULL); //定义一个数组 $x=0; //定义三个作为下标的变量 $y=3; $z=5; echo " ...