POJ 2406  KMP求字符串循环节

来源:互联网 发布:阴阳师自动刷御魂软件 编辑:程序博客网 时间:2024/05/17 22:50

  还是一道求字符串循环节的问题,用KMP算法可以轻松解决,只要注意是以什么结束的就可以了。。。。。。题目:

Power Strings
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 19573 Accepted: 8173

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

abcdaaaaababab.

Sample Output

143
ac代码;

#include <iostream>#include <string.h>#include <cstdio>using namespace std;const int N=1000010;int len,nextt[N];char str[N];int get_next(){  nextt[0]=0;  for(int i=1;i<len;++i){    int temp=nextt[i-1];while(temp&&str[temp]!=str[i])temp=nextt[temp-1];if(str[i]==str[temp])nextt[i]=temp+1;elsenextt[i]=0;  }  int x=len-nextt[len-1];  if(len%x==0)  {    int y=len/x;    return y;  }  else  return 1;}int main(){while(scanf("%s",str)){if(str[0]=='.')break;  len=strlen(str);  int x=get_next();  printf("%d\n",x);}  return 0;}