ZOJ_1905_Power Strings 进击のkmp
ZOJ_1905_Power Strings 进击のkmp

ZOJ_1905_Power Strings 进击のkmp
• 发表于 5年前
• 阅读 19
• 收藏 0
• 评论 0
Power Strings Time Limit: 5 Seconds       Memory Limit: 32768 KB

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.

Output

For each s you should print the largest n such that s = a^n for some string a. 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.

Sample Input

abcd
aaaa
ababab
.

Sample Output

1
4
3

``````#include <iostream>
#include <string>
using namespace std;

int next[1000002];
string str;
int len;

void get_next(string T, int next[])
{
int i,j;
next[1]=0;
j=0;i=1;
while(i<len)//不要等于m
{
if(j==0||T[i]==T[j]){
++i;
++j;//这个地方完全可以弄到m所以等于的时候不用继续循环
if(T[i]!=T[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}

int
main()
{
while(cin>>str && str!="."){
len=str.length();
get_next(str, next);
if(len%(len-next[len])==0)
cout<<len/(len-next[len])<<endl;
else
cout<<"1"<<endl;
}
return 0;
}``````

×