hdu 1358

Posted LMissher

tags:

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

题意:输入一个字符串,问长度大于2的所有从首元素开始的子串是否为循环串,是的话循环了几次。

题解:用Kmp算法求出每个i的next【i】,并设t=i-next【i】,if(i%t==0&&i/t>1)。则该子串为循环串并且循环次数为i/t。

 

代码:

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

char
str[1000005];
int
next[1000005];

void
getnext()
{

    int
i = 0,j = -1;
    memset(next,0,sizeof(next));
    next[0] = -1;
    while
(str[i])
    {

        if
(j == -1 || str[i] == str[j])
        {

            i++;
            j++;
            next[i] = j;
        }

        else

        j = next[j];
    }
}

int
main()
{

    int
n,cnt = 1;
    while
(scanf("%d",&n)!=EOF && n)
    {

        scanf("%s",str);
        printf("Test case #%d\n",cnt++);
        getnext();
        int
i,t;
        for
(i = 2;str[i-1];i++)
        {

            t = i-next[i];
            if
(i%t == 0 && i/t>1)
            printf("%d %d\n",i,i/t);
        }

        puts("");
    }

    return
0;
}
  

以上是关于hdu 1358的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1358

Period HDU - 1358

hdu 1358 Period

HDU - 1358 Period

hdu 1358 Period(kmp)

HDU - 1358 Period