• 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;
    }
  • 相关阅读:
    day08超市商品库存案例
    day07
    day06_03
    day06_02
    day06_01
    最简单的库存管理java案例
    Day05_homework
    方法的使用注意事项
    day05
    冒泡排序
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7800668.html
Copyright © 2020-2023  润新知