A

来源:互联网 发布:商城网站如何优化 编辑:程序博客网 时间:2024/06/09 16:04

点击打开链接


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
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.



#include <stdio.h>#include <stdlib.h>#include <string.h>char s[1000005], t[1000005];int next[1000005]; int Kmp(char* s, int n, char* t, int m) {    int i = m, j = 0;    int ans=0;    while(i < n) {        if(j == -1 || s[i] == t[j]) {            ++i; ++j;            if(j == m)             {            ans++;            j=0;}        }        else             return 0;    }      return ans;}void getnext(char *t, int m) {    int i = 0, j = 0;    next[0] = -1; j = next[i];    while(i < m) {        if(j == -1 || t[i] == t[j])           next[++i] = ++j;        else           j = next[j];    }}int main(){    while(~scanf("%s",s))    {    if(s[0]=='.')      break;    int n,m,i,j,ans=0;        n=strlen(s);        strcpy(t,s);        for(i=1;i<=(n/2);i++)          if(n%i==0)          {        m=i;        getnext(t, m);        ans=Kmp(s,n,t,m);if(ans)  break;             }        if(i<=(n/2))          printf("%d\n",ans+1);        else  printf("1\n");  }    return 0;}