POJ 2406 (KMP)

Power Strings
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 41709   Accepted: 17343

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 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.

Source

Waterloo local 2002.07.01

题意:求串的最小循环节的循环次数。

n-next[n]求出最小循环节,然后判断下是不是被长度整除。

#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define maxn 1111111

char T[maxn];
int n;
#define next Next
int next[maxn];

void get_next (char *p) {  
    int m = strlen (p);
    int t;  
    t = next[0] = -1;  
    int j = 0;  
    while (j < m) {  
        if (t < 0 || p[j] == p[t]) {//匹配  
            j++, t++;  
            next[j] = t;
        }  
        else //失配  
            t = next[t];  
    } 
}  

int main () {
    while (scanf ("%s", T) == 1) {
        n = strlen (T);
        if (n == 1 && T[0] == '.')
            break;
        get_next (T); 
        int len = n-next[n];
        if (n%len == 0) 
            printf ("%d\n", n/len);
        else 
            printf ("1\n");
    }
    return 0;
}


你可能感兴趣的:(POJ 2406 (KMP))