Codeforces 432D Prefixes and Suffixes(KMP+dp)

题目连接:Codeforces 432D Prefixes and Suffixes

题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次。

解题思路:依据性质能够依据KMP算法求出全部的前后缀串,然后利用dp求解,dp[i]表示从1到i这个子串出现过的次数。转移方程dp[jump[i]]+=dp[i]。随意一个dp[i]的初始状态应该是1。

#include <cstdio>
#include <cstring>

const int N = 1e5+5;

int n, jump[N], c, r[N], dp[N];
char str[N];

void getJump() {
    int k = 0;
    n = strlen(str+1);
    for (int i = 2; i <= n; i++) {
        while (k && str[i] != str[k+1])
            k = jump[k];

        if (str[i] == str[k+1])
            k++;
        jump[i] = k;
    }
}

int main () {
    scanf("%s", str+1);
    getJump();

    c = 0;
    for (int i = jump[n]; i; i = jump[i]) {
        r[c] = i;
        c++;
    }

    memset(dp, 0, sizeof(dp));
    for (int i = n; i; i--) {
        dp[i]++;
        dp[jump[i]] += dp[i];
    }

    printf("%d\n", c+1);
    for (int i = c-1; i >= 0; i--)
        printf("%d %d\n", r[i], dp[r[i]]);
    printf("%d %d\n", n, dp[n]);
    return 0;
}
时间: 2024-10-11 23:20:36

Codeforces 432D Prefixes and Suffixes(KMP+dp)的相关文章

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

题目链接: https://codeforces.com/contest/432/problem/D 题解L 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大小. 做法二: 后缀数组 按照height分组,二分查找即可. 代码 KMP: #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> #include<utility&g

codeforces432D Prefixes and Suffixes(kmp+dp)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Prefixes and Suffixes You have a string s = s1s2...s|s|, where |s| is the length of string s, and si its i-th character. Let's introduce several definitions: A substring s[i..j] (1 ≤ i ≤ j

Codeforces 432D Prefixes and Suffixes

http://codeforces.com/problemset/problem/432/D 题目大意: 给出一个字符串,求有多少种长度的前缀和后缀相等,并且得到的这个子串在原字符串中出现的次数. 思路:预处理kmp,发现从n开始的next[n]一直往下都是合法的前缀后缀,先记录下来,然后从n往1dp,每次都是 dp[i]++,dp[next[i]]+=dp[i],这样转移之后再输出即可. 1 #include<cstdio> 2 #include<cmath> 3 #includ

codeforces Round 246 D. Prefixes and Suffixes (后缀数组 || KMP)

题目大意: 求一个子串,子串既是前缀又是后缀. 然后再求出它在整个串中出现的次数. 思路分析: 可以很容易想到如何判断一个串既是前缀又是后缀. 只需要它与 sa[0] 的lcp 等于 整个串的长度减去它的 sa 值. 然后接下来的工作是判断出现了 多少次. 首先我们想到,如果这个子串是目标前后缀. 那么出现过它的子串在sa 中的下标一定比这个串大. 因为它已经是最简的了. 然后可以直接二分求出他出现了多少次. #include <iostream> #include <cstdio>

codeforces 432D D . Prefixes and Suffixes(后缀数组)

题目链接: codeforces 432D 题目大意: 给出一个字符串,求有多少种长度的前缀和后缀相等,并且得到的这个子串在原字符串中出现的次数. 题目分析: 首先利用后缀数组处理出sa[i]代表排名第i位的后缀的起始位置 处理出rank[i]代表第i个位置起始的后缀的rank 处理出height[i]代表排名第i位的和排名i-1位的公共前缀的长度. 那么我们要找后缀和前缀相等的就是找到rank[0],然后按照排名,向前向后遍历,任意两个后缀的公共前缀就是他们[i,j]区间内所有height的最

CodeForces Round #527 (Div3) C. Prefixes and Suffixes

http://codeforces.com/contest/1092/problem/C Ivan wants to play a game with you. He picked some string ss of length nn consisting only of lowercase Latin letters. You don't know this string. Ivan has informed you about all its improper prefixes and s

【KMP+DP】Count the string

KMP算法的综合练习 DP很久没写搞了半天才明白.本题结合Next[]的意义以及动态规划考察对KMP算法的掌握. Problem Description It is well known that AekdyCoin is good at string problems as well as number theory problems. When given a string s, we can write down all the non-empty prefixes of this str

CF432D Prefixes and Suffixes

CF432D Prefixes and Suffixes 题意 给你一个长度为n的长字符串,"完美子串"既是它的前缀也是它的后缀,求"完美子串"的个数且统计这些子串的在长字符串中出现的次数 分析 求出nex数组 , 在求出每个前缀出现的次数 , 从nex[n] 往下走就行了 其实这道题是 , KMP 求每个前缀出现次数的模板题 求前缀出现次数的写法 for(int i = 1 ; i <= n ; ++i) num[i]++; for(int i = n ;

CodeForces 540D Bad Luck Island 概率dp

CodeForces 540D 应该是简单概率dp,由于写得少显得十分蠢萌 求期望逆推,求概率正推,大概是这么个意思,贴一发留恋 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define db double const int maxn=108; db dp[maxn][maxn][maxn]; int main() { int i,j,n,m,k,p; whi