[KMP]HDU1358 Period

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[KMP]HDU1358 Period相关的知识,希望对你有一定的参考价值。

题目链接

思考

题目就是利用KMP的失配数组来找循环串.具体看代码注释

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int nexta[1000002];
char s[1000002];
int n;
//失配数组 
void getnexta()
{
    memset(nexta,0,sizeof(nexta));
    int k = -1,j = 0;
    nexta[0] = -1;
    while(j < n )
    {

        if(k == -1 || s[k] == s[j])
        {
            nexta[j + 1] = k + 1;
            j ++;
            k ++;
        }
        else
        {
            k = nexta[k];
        }
    }

}
int main()
{
        int t = 0,temp;
        while(1)
        {
            t ++;
            scanf("%d",&n);
            if(n == 0)
                break;
            scanf("%s",s);
            printf("Test case #%d\n",t);
            getnexta();
            for(int i = 1; i <= n; i ++) //从1开始循环的原因是 nexta[0]必然是0 
            {
                if(nexta[i] == 0)
                {
                    continue;
                }
                else
                {
                    //这里是主要 
                    temp = i - nexta[i] ;//循环小节的长度
                    if( i  % temp == 0 && i  / temp  > 1)//这是由于nexta[i]表示的是i-1
                        printf("%d %d\n",i ,i  / temp);
                }

            }
        printf("\n");
        }
        return 0;
}

 

最后吐槽下我之前用KMP模板,之前的那个模板失配数组有毛病。

aaa这种串的失配数组是 0 0 1 大写的服!

以上是关于[KMP]HDU1358 Period的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1358 Period(kmp)

HDU - 1358 - Period (KMP)

hdu 1358 period KMP入门

HDU-1358 Period 字符串问题 KMP算法 求最小循环节

HDU--1358--KMP算法失配函数getfail()的理解--Period

HDU 1358 Period