Problem here
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
Solution
#include <iostream>
#include <string>
//#include <fstream>
#define MAX_NUM 9999999
using namespace std;
//ifstream fin("10298.in");
//ofstream fout("10298.out");
int next_pos[1000001];
void getNext(string str){
next_pos[0] = -1;
int j = 0, k = -1;
while(j < str.size()){
if(k == -1 || str[j] == str[k]){
next_pos[++j] = ++k;
}
else{
k = next_pos[k];
}
}
}
int main(){
string input;
while(cin >> input){
if(input == ".")
break;
getNext(input);
int length = input.size();
if(length % (length- next_pos[length]) == 0 && next_pos[length] != 0)
cout << length / (length - next_pos[length]) << endl;
else
cout << 1 << endl;
}
return 0;
}