算法题:HDU 3336 Count the string(经典,KMP+DP)

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3336
题目大意:

给一个字符串,求出这个字符串的所有前缀出现的次数之和。

分析与总结 :

运用到了dp的思想,dp弱逼一个表示压力很大。。。

向这位博主大人学习了: http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html

找出前缀后,算出现 次数,很明显的是一个单模式串匹配问题,KMP 可以很好的解决,不过如果直接这样暴力的话,O(n^2) 的复杂度还是不行的。。。因此,我们试着考虑 KMP 算法进行快速匹配的本质核心所在,其实就是 next[] 数组

而这个的本质其实就是 S[1..next[i]]=S[i-next[i]+1...i]

即模式串的最 长公共前后缀串的长度

举个例子 ababa

我们要算这个字符串的前缀的出现次数和

a 出现 3

ab 出现 2

aba 出现 2

abab 出现 1

ababa 出现 1

那么我们可以这样来 DP

记 dp[i] 为前 i 个字符组成的前缀出现的次数

则 dp[next[i]]+=dp[i]

这个转移方程是什么含义呢???

我们可以这样来想

如 dp[3] 对应 aba 且 next[5]=3

则 dp[3]+=dp[5] 为答案

因为  S[1..next[i]]=S [i-next[i]+1...i]  aba 自己出现了 dp[3] ,然后 S[i-next[i]+1..i] 出现了 dp[5] 也是 aba 会出现的地方,因此也要加上

(还是要自己 YY 一下,这里说不清啊)

初始化的时候, 记得 dp[i]=1 表示自身匹配算 1 次

时间: 2024-09-11 02:34:14

算法题:HDU 3336 Count the string(经典,KMP+DP)的相关文章

hdu 3336 Count the string

点击打开链接hdu 3336 思路:kmp+next数组的应用 分析: 1 题目要求的是给定一个字符串s,求字符串s的所有的前缀在s的匹配的次数之和mod10007. 2 很明显n<= 200000,分析一下那么就要n个前缀如果每一个前最都去匹配s的话复杂度就是o(n^2),那么肯定是TLE的,所以要考虑另外的思路 3 我们知道next[j] = len,表示的是在前j个字符里前缀和后缀的最大的匹配的长度为len,所以根据next数组的性质,我们只要去枚举j的值从n->1,为什么要从n开始而不

HDU3336 Count the string 一道KMP的巧解

http://acm.hdu.edu.cn/showproblem.php?pid=3336 题目 这是喵呜大神用KMP做的,46MS  #include <stdio.h> #define MOD 10007 char b[200005]; int dp[200005]; int p[200005]; int n; int Pre() { int s,i,j; dp[0]=1; j=-1; p[0]=-1; s=1; for (i=1;i<n;i++) { while(j>=0

算法:hdu 4003 Find Metal Mineral (树形背包dp)

题意 给一棵n个节点的树, 节点编号为1~n, 每条边都有一个花费值. 有k个机器人从S点出发, 问让 机器人遍历所有边,最少花费值多少? 思路 很好的一题, 推荐! 前天看的这题, 今天才想出来的. 方法想出来后,代码很简单 最近做的几道dp,都是一开始没什么想法,然后过两天再想就想出来了,也许是因 为人的潜意识其实会一直在想某个问题 翻看一下网上其他人的做法, 和我的稍有不同, 他们是用f(i, j)表示子树i用j个机器人的最少花费, 一开始我也是这样 去想,但是没想到怎么去状态转移. 然后

算法:hdu 1011 Starship Troopers (树形背包dp)

题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 在要派m个战士去找金子,从入口进入.每次只有消灭完当前洞穴的所有虫子,才可以选择进入下一个洞穴. 一个战士可以消灭20只虫子,如果要杀死x只虫子,那么要x/20向上取整即(x+19)/20个战士. 如果要 获得某个洞穴的金子,必须留下足够杀死所有虫子的战士数量, 即(x+19)/20个战士,然后这

算法题:UVA 10564 Paths through the Hourglass(dp)

In the hourglass to the right a path is marked. A path always starts at the first row and ends at the last row. Each cell in the path (except the first) should be directly below to the left or right of the cell in the path in the previous row. The va

算法题:poj 3080 Blue Jeans(KMP匹配,枚举子串)

链接: http://poj.org/problem?id=3080 题目大意: 给出m(2<=m<=10)个DNA序列, 求出这m个序列中最长的公共字串.如果有多个相同长度的, 输出字典序最小的. 分析与总结: 依次枚举所有的子串, 然后再看是否在所有序列中都能够匹配.保存下长度最大且字典序最小的序 列. 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace st

算法:HDU 4679 Terrorist’s destroy(树形dp | 多校8)

题意 给一棵树,每条边有个权值,要删掉一条边,删掉以后会变成两颗子树,设两个子树的直径分别 为d1, d2,删掉的这条边权值为w 问删掉哪一条边,使得w*max(d1, d2)的值最小? 思路 典型的 树形dp, 但比赛时的代码写得非常搓,200+行,还好1A了 f(u, 0):以u点为顶点的子树的直径 f (u, 1):以u的父节点为顶点减去u的子树部分的子树的直径 先用树形dp求出上面的数组 然后 答案等于 min{ w(u,v)*max{f(v,0), f(v,1)} | v为u的子节点

算法题:UVA 437 The Tower of Babylon (dp + DAG最长序列)

The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you the whole story: The babylonians

算法题:UVA 590 Always on the run(dp)

Screeching tires. Searching lights. Wailing sirens. Police cars everywhere. Trisha Quickfinger did it again! Stealing the `Mona Lisa' had been more difficult than planned, but being the world's best art thief means expecting the unexpected. So here s