现在的位置: 首页 > 综合 > 正文

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

2013年10月14日 ⁄ 综合 ⁄ 共 1365字 ⁄ 字号 评论关闭
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();
  }
}

 

抱歉!评论已关闭.