Power Strings next数组应用

来源:互联网 发布:linux dd iso u盘 编辑:程序博客网 时间:2024/05/21 22:53
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

abcdaaaaababab.

Sample Output

143


题目大意:字符串s由串a连续组合在一起形成,即a^n = s,求n的最大值

next数组又要出场了,对于next[len]表示字符串前后匹配的长度,n - next[len]即为重叠字符串(a)的长度,所以再除len即得到了次数n;否则即为整个字符串s,n = 1

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;const int N = 1e6 + 3;char s[N];int next[N];void GetNext(){    int j = -1, len = strlen(s);    next[0] = -1;    for(int i = 1; i < len; i++)    {        while(j != -1 && s[j + 1] != s[i])            j = next[j];        if(s[j + 1] == s[i]) j++;        next[i] = j;    }}int main(){    while(~scanf("%s", s))    {        if(s[0] == '.') break;        GetNext();        int len = strlen(s);        if(len % (len - next[len - 1] - 1) == 0)            printf("%d\n", len / (len - next[len - 1] - 1));        else            printf("1\n");    }    return 0;}


原创粉丝点击