Description
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 shoshould print the largest N such that S = a ^ N for some string.
Sample Input
abcdaaaaababab.
Sample output
143 question: the question requires finding the minimum number of cyclic segments for a given string, however, the restriction here is that if the string is not exactly composed of N smallest cycle segments, it is considered that a whole string is a loop section. Idea: KMP Application#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1000010;char pattern[maxn];int next[maxn];void getNext() {int m = strlen(pattern);next[0] = next[1] = 0;for (int i = 1; i < m; i++) {int j = next[i];while (j && pattern[i] != pattern[j])j = next[j];next[i+1] = pattern[i] == pattern[j] ? j+1 : 0;}int len = m - next[m];if (m % len == 0)printf("%d\n", m/len);else printf("1\n");}int main() {while (gets(pattern)) {if (strcmp(pattern, ".") == 0)break;getNext();}return 0;}
Poj-2406 power strings (KMP loop section)