题目链接: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的更多相关文章

  1. Codeforces 432D Prefixes and Suffixes(KMP+dp)

    题目连接:Codeforces 432D Prefixes and Suffixes 题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次. 解题思路:依据性质能够依据KMP算法求出 ...

  2. Codeforces 432D Prefixes and Suffixes kmp

    手动转田神的大作:http://blog.csdn.net/tc_to_top/article/details/38793973 D. Prefixes and Suffixes time limit ...

  3. Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)

    题目链接: https://codeforces.com/contest/432/problem/D 题解: 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大 ...

  4. codeforces 432D Prefixes and Suffixes

    由于包含了前缀与后缀,很容易想到用KMP去算前缀与后缀的公共缀.另外要计算某个后缀在整个串中出现的次数,由于后缀自动机是比较容易求的,然后就直接上后缀自动机了.先分别用KMP算法与后缀自动机跑一遍,然 ...

  5. codeforces - 432D Prefixes and Suffixes (next数组)

    http://codeforces.com/problemset/problem/432/D 转自:https://blog.csdn.net/tc_to_top/article/details/38 ...

  6. Codeforces 1092C Prefixes and Suffixes(思维)

    题目链接:Prefixes and Suffixes 题意:给定未知字符串长度n,给出2n-2个字符串,其中n-1个为未知字符串的前缀(n-1个字符串长度从1到n-1),另外n-1个为未知字符串的后缀 ...

  7. Codeforces 461B Appleman and Tree:Tree dp

    题目链接:http://codeforces.com/problemset/problem/461/B 题意: 给你一棵树(编号从0到n-1,0为根节点),每个节点有黑白两种颜色,其中黑色节点有k+1 ...

  8. Codeforces Beta Round #71 C【KMP+DP】

    Codeforces79C 题意: 求s串的最大子串不包含任意b串: 思路: dp[i]为以i为起点的子串的最长延长距离. 我们可以想到一种情况就是这个 i 是某个子串的起点,子串的长度-1就是最短, ...

  9. Codeforces 148D Bag of mice:概率dp 记忆化搜索

    题目链接:http://codeforces.com/problemset/problem/148/D 题意: 一个袋子中有w只白老鼠,b只黑老鼠. 公主和龙轮流从袋子里随机抓一只老鼠出来,不放回,公 ...

随机推荐

  1. hdu 1598 find the most comfortable road(并查集)

    题意:略 分析:多询问问题,利用并查集加速.类似于kruskal对MST的构建:枚举最小的边,逐渐将更大的边加入集合,当查询的点在同一个集合,那么当前最小值,就是所加的最后一条边与第一条只差. 注意: ...

  2. CAP理论学习

    CAP理论是对分布式系统的3个特性所下的一个定性的结论,可用于指导分布式系统的设计. CAP理论断言任何基于网络的数据共享系统,最多只能满足数据一致性.可用性.分区容忍性三要素中的两个要素. 在英语中 ...

  3. Python鸡汤

    标准库 很正确 外部库 有一些风险,可能有bug,可能文档不全,可能长时间未更新. ipython 1 pip 这应该是安装Python后第一个需要的命令 pip install -i -i, --i ...

  4. TSharding源码阅读

    需要的背景知识:Spring 和Mybatis 实现原理和源码, javaassist字节码增强的使用, java及设计模式的使用 1 读取解析数据库配置文件 DataSourceScanner实现了 ...

  5. bat命令遍历文件和bat参数说明

    **************************************************************************************************** ...

  6. c#脚本控制shader

    如图所示,c#脚本控制shader颜色. public class ControlColor : MonoBehaviour { , , , ); public Material mat; publi ...

  7. 转载 --iOS QQ第三方登实现

    我们经常会见到应用登陆的时候会有QQ,微信,微博等的第三方登陆 如图: 下面我们主要讲一下qq的第三方登陆如何实现 首先,到官网注册: http://wiki.connect.qq.com 一,下载S ...

  8. ajax 和jsonp 不是一码事 细读详解

    由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...

  9. POJ 2187 Beauty Contest【凸包周长】

    题目: http://poj.org/problem?id=1113 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

  10. 九度OJ 1341:艾薇儿的演唱会 (最短路)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:528 解决:241 题目描述: 艾薇儿今天来到了中国,她计划两天后在哈尔滨举行一场个人的演唱会.由于出现了紧急情况,演唱会的举办方要求艾薇儿 ...