题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1358题意:
给出一段序列,求这段字符串的所有前缀中有哪些是循环串,输出这些前缀的位置和循环周期。
思路:
与hdu3746基本相同,就是利用next[]数组来求循环节长度判断是否是循环串。代码:
#include <bits/stdc++.h>
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define EPS 1e-6
#define N 1123456
using namespace std;
int n,m,sum,res,flag;
void getNext(char *pre, int len, int *next)
{
int i = 0,j = -1;
next[0] = -1;
while(i < len)
{
if(j == -1 || pre[i] == pre[j])
{
i++,j++;
next[i] = j;
}
else j = next[j];
}
}
char s[N];
int main()
{
int i,j,k,kk,cas,T,t,x,y,z;
cas=0;
while(scanf("%d",&n)!=EOF&&n)
{
printf("Test case #%d\n",++cas);
scanf("%s",s);
n=strlen(s);
int a[n+1];
getNext(s,n,a);
for(i=2;i<=n;i++)
{
t=i-a[i];
if(i!=t&&i%t==0)printf("%d %d\n",i,i/t);
}
printf("\n");
}
return 0;
}
本文详细介绍了如何解决HDU平台上的问题1358,即找出给定序列的所有循环串及其位置和循环周期。通过使用next数组,实现高效地判断循环节长度并输出结果。
2356

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



