Power Strings
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcd aaaa ababab .
Sample Output
1 4 3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
看标题 就差不多知道这道字符串的题目是干么的::解决循环节的
一开始并不知道KMP算法还能解决字符串的循环节,其实就是通过next数组来求解
其实对于长度为len的字符串,它也有自己的循环周期
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include<cmath>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int N=1000010;
int n;
int next[N];
char s[N];
void Getnext(int len)
{
memset(next,0,sizeof next);
int j=-1;
next[0]=-1;int i=0;
while(i<len)
{
if(j==-1||s[i]==s[j])
j++,i++,next[i]=j;
else
j=next[j];
}
}
int main()
{
while(scanf("%s",s))
{
if(s[0]=='.') break;
int len=strlen(s);
Getnext(len);
int ans=1;//这里要从1开始
if(len%(len-next[len])==0)
ans=len/(len-next[len]);
// rep(i,0,len)
// printf("%d ",next[i]);
// printf("\n");
printf("%d\n",ans);
}
return 0;
}