POJ 2406 Power Strings 【后缀数组||KMP】


Power Strings

Time Limit: 3000MS

Memory Limit: 65536K

Total Submissions: 51298

Accepted: 21420

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-negativeinteger is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

Input

Eacht est 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. Aline 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.

 

【题意】


给出一个字符串,要把它写成(x)n的形式,问n的最大值。


【思路】


方法一:后缀数组 (2485MS)


用后缀数组求出字符串的各种信息:Rank数组,height数组等等。


然后我们从1开始枚举循环节的长度i。如果字符串存在长度大于等于2的循环节,需要满足以下条件


  1. 首先循环节的长度必须是字符串长度的因子。

  2. 要保证Rank[0]==Rank[i]+1,因为两者比较字典序的时候前面的都相同,只是原串更长一些。

  3. 而且从i开始的后缀与原串的公共前缀为前者的长度即len-i。


否则结果就为1。


PS: 此题数据范围较大,用DA算法会超时,用DC3算法也只是刚刚过,所以建议用下面的方法。


方法二: KMP (141MS)


设字符串的长度为len,我们知道nex[len]表示既是原串前缀又是原串后缀的字符串最大长度(不包括本身),所以如果字符串的循环节长度大于等于2,那么len-nex[len]一定是字符串的最小周期,且一定能整除len。否则输出1。



代码一:后缀数组

#include 
#include 
#include 
#include 
#include 
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T,scanf("%d",&T),while(T--)
#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)=0; i--) b[--ws[wv[i]]]=a[i];
}

void dc3(int *r,int *sa,int n,int m)
{
    int i,j,*rn=r+n;
    int *san=sa+n,ta=0,tb=(n+1)/3,tbc=0,p;
    r[n]=r[n+1]=0;
    for(i=0;i

代码二:KMP


#include 
#include 
#include 
#include 
#include 
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T,scanf("%d",&T),while(T--)
#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)





你可能感兴趣的:(KMP匹配,Manacher算法,后缀数组,POJ)