POJ 2406 Power Strings(KMP OR 后缀数组,4级)

I - Power Strings
Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
Appoint description: 

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.

思路:KMP的next 指的是1-next[] 与 len-next[]-len是一样的。

#include<iostream>
#include<cstring>
#include<cstdio>
#define ll(x) (1<<x)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define clr(f,z) memset(f,z,sizeof(f))
using namespace std;
const int msize=1e6+9;
class KMP
{public:
 int next[msize],len;
 char s[msize];
 void getnext()
 { int j=0,k=-1;
   len=strlen(s);
   next[j]=-1;
  while(j<len)
  {
   if(k==-1||s[j]==s[k])
   {
    ++j;++k;
    next[j]=k;
   }
   else k=next[k];
  }
 }
 void getans()
 {int ans;
  getnext();
  if(len%(len-next[len])==0)
  ans=len/(len-next[len]);
  else ans=1;
  printf("%d\n",ans);
 }
};
KMP s;
int main()
{// freopen("data.in","r",stdin);
  while(~scanf("%s",s.s))
  {
   if(s.s[0]=='.')break;
   s.getans();
  }
}


 


posted @ 2013-09-24 21:05  剑不飞  阅读(161)  评论(0编辑  收藏  举报