hdu 3336 Count the string【kmp】

http://acm.hdu.edu.cn/showproblem.php?pid=3336

题意:给你一个字符串,问字符串每一个前缀在字符串中的出现总次数。

思路:kmp的应用,自身和自身进行匹配,每次匹配时,如果没有匹配到结束,模式串按next数组向后移动,出现匹配至结束的情况,匹配串往后移动一位

  ,匹配过程中,出现失配时,统计当前已经匹配的字符个数,累加到总数中,直到匹配串移动到最后一位。

其实前两天就在网上看题解用kmp+dp的方法来写了这道题,然而后来细思一些细节,自己并没有弄懂,所以,我就没有写成题解,最后,还是我师父出面,把这道题给解释了

#include<stdio.h>
#define N 200010
#define mod 10007
int next[N];
char str[N];
void Get_next(int n)
{
    int j ,k;
    j = 0;
    next[j] = k = -1;
    while(j <= n)
    {
        if(k == -1||str[j] ==str[k])
            next[++j] = ++k;
        else
            k = next[k];
    }
    return;
}

int KMP(int n)
{
    int i,j,k;
    i = 1;
    j = k = 0;
    while(i <= n)
    {
        if(j == -1||str[i]==str[j])
        {
            i++;
            j++;
        }
        else//失配时 
        {
            k += j;//每次累加起点不同匹配的字符串长度,保证了起点不重复 
            k%=mod;
            j = next[j];
        }
    }
    return k ;
}
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        getchar();
        scanf("%s",str);
        Get_next(n);
        printf("%d
",(KMP(n)+n)%mod);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/hellocheng/p/7800668.html