Codeforces 432D Prefixes and Suffixes:KMP + dp
题目链接:http://codeforces.com/problemset/problem/432/D
题意:
给你一个字符串s,让你找出所有既是前缀又是后缀的子串,并输出它们分别出现了多少次。
题解:
先对原串求一次nex数组。
然后枚举位置i:
sub(k)表示前缀s[0 to k]
dp[i]表示sub(i)在原串s中的出现次数
假设nex[i] = a, nex[a] = b, nex[b] = c ... nex[z] = -1
则sub(a), sub(b), sub(c)...sub(z)均以s[i]结尾,dp[a...z]均+1。
然而一个一个加会T...
所以:
初始时所有的 dp = 1
每次:if(nex[i] != -1) dp[nex[i]] += dp[i]
一路传递下去就好。
最后从nex[len-1]开始往前跳nex。
对于每次跳到的nex,sub(nex)一定也是s的后缀。
此时输出它的出现次数dp[nex]。
另外因为要顺着输出,而nex是倒着跳的,所以先存到stack里再输出。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#define MAX_N 100005 using namespace std; int n;
int dp[MAX_N];
int nex[MAX_N];
char s[MAX_N]; void cal_nex(char *p,int len)
{
nex[]=-;
int k=-;
for(int i=;i<len;i++)
{
while(k>- && p[i]!=p[k+]) k=nex[k];
if(p[i]==p[k+]) k++;
nex[i]=k;
}
} int main()
{
scanf("%s",s);
n=strlen(s);
cal_nex(s,n);
for(int i=;i<n;i++) dp[i]=;
for(int i=n-;i>=;i--)
{
if(nex[i]!=-) dp[nex[i]]+=dp[i];
}
stack<int> stk;
int p=n-;
while(p!=-)
{
stk.push(p);
p=nex[p];
}
cout<<stk.size()<<endl;
while(!stk.empty())
{
int now=stk.top();
stk.pop();
cout<<now+<<" "<<dp[now]<<endl;
}
}
Codeforces 432D Prefixes and Suffixes:KMP + dp的更多相关文章
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
题目连接:Codeforces 432D Prefixes and Suffixes 题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次. 解题思路:依据性质能够依据KMP算法求出 ...
- Codeforces 432D Prefixes and Suffixes kmp
手动转田神的大作:http://blog.csdn.net/tc_to_top/article/details/38793973 D. Prefixes and Suffixes time limit ...
- Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)
题目链接: https://codeforces.com/contest/432/problem/D 题解: 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大 ...
- codeforces 432D Prefixes and Suffixes
由于包含了前缀与后缀,很容易想到用KMP去算前缀与后缀的公共缀.另外要计算某个后缀在整个串中出现的次数,由于后缀自动机是比较容易求的,然后就直接上后缀自动机了.先分别用KMP算法与后缀自动机跑一遍,然 ...
- codeforces - 432D Prefixes and Suffixes (next数组)
http://codeforces.com/problemset/problem/432/D 转自:https://blog.csdn.net/tc_to_top/article/details/38 ...
- Codeforces 1092C Prefixes and Suffixes(思维)
题目链接:Prefixes and Suffixes 题意:给定未知字符串长度n,给出2n-2个字符串,其中n-1个为未知字符串的前缀(n-1个字符串长度从1到n-1),另外n-1个为未知字符串的后缀 ...
- Codeforces 461B Appleman and Tree:Tree dp
题目链接:http://codeforces.com/problemset/problem/461/B 题意: 给你一棵树(编号从0到n-1,0为根节点),每个节点有黑白两种颜色,其中黑色节点有k+1 ...
- Codeforces Beta Round #71 C【KMP+DP】
Codeforces79C 题意: 求s串的最大子串不包含任意b串: 思路: dp[i]为以i为起点的子串的最长延长距离. 我们可以想到一种情况就是这个 i 是某个子串的起点,子串的长度-1就是最短, ...
- Codeforces 148D Bag of mice:概率dp 记忆化搜索
题目链接:http://codeforces.com/problemset/problem/148/D 题意: 一个袋子中有w只白老鼠,b只黑老鼠. 公主和龙轮流从袋子里随机抓一只老鼠出来,不放回,公 ...
随机推荐
- Error in as.POSIXlt.character(x, tz, ...) :
> sqlFetch(channel,"user")Error in as.POSIXlt.character(x, tz, ...) : character strin ...
- linux下apache+php搭建配置记录
第1章 环境说明1.1 系统说明Centos 6.2 (最小化安装)1.2 软件说明httpd-2.4.2.tar.gzapr-util-1.4.1.tar.gzapr-1.4.6.tar.gzpc ...
- 多媒体开发之---h264 rtp打包
http://blog.csdn.net/newthinker_wei/article/details/8997440 http://blog.csdn.net/dengzikun/article/d ...
- Java线程面试题:子线程先运行 2 次,然后主线程运行 4 次,如此反复运行 3 次
package thread; /** * 需求:线程编程:子线程先运行 2 次,然后主线程运行 4 次,如此反复运行 3 次. * @author zhongfg * @date 2015-06-1 ...
- hdu 5285 wyh2000 and pupil(二染色)
第一次用vector解得题.值得纪念,这道题是二染色问题,我用bfs解得.就是染色,推断,计数问题,其 实挺简单的,就是得判一下特殊情况,当n<2的时候就不能有解,由于题目要求每一个组至少有一个 ...
- LNMP环境搭建(二:MySQL)
1.获取MySQL官方的rpm包,根据操作系统与需要安装的MySQL版本进行选择,官方地址:https://www.mysql.com/downloads/ # cd /usr/local/src # ...
- javascript修改图片链接地址
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- json-lib-2.5-jdk.jar 需要依赖的jar包
commons-lang3-3.1.jar commons-lang-2.5.jar ezmorph-1.0.6.jar commons-collections-3.2.1.jar commons-b ...
- 学习Sharding JDBC 从入门到出门-1
感觉大神已经写好了,自己膜拜下下, 送上大神地址:http://www.cnblogs.com/zhongxinWang/p/4262650.html 这篇博客主要是理论的说明了什么是分库分表,路由等 ...
- Springboot整合日志时候出现的问题
上图是问题,按照路径去找下,发现其实是jar包重复导致的! 在对应的项目上,右键--->属性(Properties)--->JavaBuild Path 然后选择Libraries 页签 ...