Count the string - HDU 3336(next+dp)

题目大意:给你一个串求出来这个串所有的前缀串并且与前缀串相等的数量,比如:

ababa 前缀串{"a", "ab", "aba", "abab", "ababa"};

每个前缀串出现的次数{3, 2, 2, 1, 1},那么结果就是 9。

 

分析:我们可以用dp[i],表示前i长度的串的结果,那么就可以得到下面的转移方程 dp[i] = dp[next[i]] + 1。

代码如下。

=============================================================================================

#include<stdio.h>
#include<string.h>

const int MAXN = 1e6+7;
const int oo = 1e9+7;
const int mod = 10007;

char s[MAXN];
int next[MAXN], dp[MAXN];

void GetNext(char s[], int N)
{
    int i=0, j=-1;
    next[0] = -1;

    while(i < N)
    {
        if(j==-1 || s[i]==s[j])
            next[++i] = ++j;
        else
            j = next[j];
    }
}

int main()
{
    int T, N, ans;

    scanf("%d", &T);

    while(T--)
    {
        scanf("%d%s", &N, s);

        GetNext(s, N);

        next[N+1] = -1;
        ans = dp[0] = 0;

        for(int i=1; i<=N; i++)
        {
            dp[i] = (dp[next[i]] + 1) % mod;
            ans = (ans+dp[i]) % mod;
        }

        printf("%d\n", ans);
    }

    return 0;
}
时间: 2024-11-09 07:59:34

Count the string - HDU 3336(next+dp)的相关文章

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; ManacherK - Count the string HDU - 3336(前缀数量问题)

K - Count the string HDU - 3336 题目链接:https://vjudge.net/contest/70325#problem/K 题目: 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 t

hdu 1011(树形dp)

Mark.看着吴神博客写的,还未完全懂. 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string>

HDU 4960 (水dp)

Another OCD Patient Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. This morning, his children played with plasticene. They broke the plasticene into N pieces, and put them in a line. Each piece has a volume Vi. Since Xi

HDU 4035Maze(概率DP)

HDU 4035   Maze 体会到了状态转移,化简方程的重要性 题解转自http://blog.csdn.net/morgan_xww/article/details/6776947 /** dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 (概率为ei) 3.和该点相连有m条边,随机走一条 求:走出迷宫所要走的边数的期望值. 设 E[i]表示

HDU 2196Computer(树形DP)

给你一颗边带权值的树,求树上的每一点距离其最远的一个点的距离 比较典型的题了,主要方法是进行两次DFS,第一次DFS求出每一个点距离它的子树的最远距离和次远距离,然后第二次DFS从父节点传过来另一侧的树上的距离它的最远距离进行一次比较便可得出任意点的最远距离了 之所以需要记录最远和次远是为了辨别父节点的最远距离是否是根据自己得来,如果是的话应该选择父节点的次远距离,保证结果的准确性 1 //#pragma comment(linker,"/STACK:102400000,102400000&qu

HDU——B-number(数位DP)

题目大意: 要找出1到n之间有多少个数含13,并且能被13整除 记忆化搜索: dp[pos][pre][mod][statu],pos位数,pre前一位,mod余数,statu状态 有2个状态:含13,不含13 <span style="font-size:18px;"><strong>#include<iostream> #include<cstring> #include<cstdio> #include<algor

HDU 3336(kmp+dp

hdu 3336(说实话理解得马马虎虎...) 题目:给出一个字符串,问该字符串的每个前缀在字符串中出现的次数之和. 思路:需要对next数组有足够的理解.设dp[i]表示以i结尾的字符串中出现的总次数(答案),那么首先在next[i]到i之间的前缀不会是对应的后缀,所以该长度的串数量恰好是dp[next[i]]+1. /* * @author: Cwind */ //#pragma comment(linker, "/STACK:102400000,102400000") #incl

(KMP)Count the string -- hdu -- 3336

http://acm.hdu.edu.cn/showproblem.php?pid=3336 Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6672    Accepted Submission(s): 3089 Problem Description It is well known that Aek

hdu 2059(龟兔赛跑 dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11256    Accepted Submission(s): 4235 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击--赛跑