| Time Limit: 3000MS | Memory Limit: 30000K | |
| Total Submissions: 13768 | Accepted: 6510 |
Description
Input
number zero on it.
Output
Sample Input
3 aaa 12 aabaabaabaab 0
Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
题目大意:每个测试给定一个字符串,若前i几个字符组成的字符串是周期串,输出i及其周期长度。
解题思路:利用kmp算法的next数组,未改进的next数组表示相同前缀后缀的长度,(i-next[i])可以看以周期,
若有i%(i-next[i])=0,则表示长度为i的该字符串是周期串。
代码如下:
#include <cstdio>
#include <cstring>
const int maxn=1000010;
int a[maxn];
int next[maxn];
int n;
void get_next()
{
int i=1,j=0;
next[1]=0;
while(i<=n)
{
if(j==0||a[i]==a[j])
{
i++;
j++;
next[i]=j;
if(i%(i-next[i])==0&&a[i]==a[next[i]])
printf("%d %d\n",i,i/(i-next[i]));
}
else
j=next[j];
}
return ;
}
int main()
{
int t=0,i;
char s;
while(scanf("%d",&n)!=EOF&&n)
{
t++;
memset(next,0,sizeof(next));
getchar();
for(i=1;i<=n;i++)
{
scanf("%c",&s);
a[i]=s-'0';
}
printf("Test case #%d\n", t);
get_next();
printf("\n");
}
return 0;
}
2552



被折叠的 条评论
为什么被折叠?



