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的主要内容,如果未能解决你的问题,请参考以下文章