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
题目:给定字符串S,求其前n位重复的次数。比如aabaabaabaab,前2位是aa,a重复了2次,前6位是aabaab,aab重复了2次,前9位是aabaabaab,aab重复了3次,前12位是aabaabaabaab,aab重复了4次。
所以输出的结果就是
2 2
6 2
9 3
12 4
题解:通过KMP求循环节长度,然后枚举每个点判断。
#include<cstdio>
#include<cstring>
using namespace std;
char s[1000005];
int next[1000005];
void get_next()
{
int i=0,j=-1;
next[0]=-1;
for(;s[i];)
if(j==-1||s[i]==s[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
int main()
{
int t,n;
for(int cas=1;scanf("%d",&n),n;++cas)
{
scanf("%s",s);
get_next();
printf("Test case #%d\n",cas);
for(int i=1;i<=n;++i)
if(i%(i-next[i])==0)
if(i/(i-next[i])>1)
printf("%d %d\n",i,i/(i-next[i]));
printf("\n");
}
return 0;
}
287



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



