您的位置:首页 > 其它

POJ 2406 Power Strings (KMP)

2014-03-21 13:24 302 查看
PowerStrings

TimeLimit:3000MS
MemoryLimit:65536K

TotalSubmissions:29663
Accepted:12387

Description

Giventwostringsaandbwedefinea*btobetheirconcatenation.Forexample,ifa="abc"andb="def"thena*b="abcdef".Ifwethinkofconcatenationasmultiplication,exponentiationbyanon-negativeintegerisdefinedinthenormalway:a^0=""(theemptystring)anda^(n+1)=a*(a^n).

Input

Eachtestcaseisalineofinputrepresentings,astringofprintablecharacters.Thelengthofswillbeatleast1andwillnotexceed1millioncharacters.Alinecontainingaperiodfollowsthelasttestcase.

Output

Foreachsyoushouldprintthelargestnsuchthats=a^nforsomestringa.

SampleInput

abcd
aaaa
ababab
.

SampleOutput

1
4
3


::初学KMP真心不容易,理解起来很吃力,还好今天老师有讲解KMP的基本原理,现在思路清晰了一点,赶紧做这道以前暴力过的题。

证明:(PKU2406POWERSTRINGS---字符串匹配,KMP算法)

定理:假设S的长度为len,则S存在循环子串,当且仅当,len可以被len-next[len]整除,最短循环子串为S[len-next[len]]
例子证明:

设S=q1q2q3q4q5q6q7q8,并设next[8]=6,此时str=S[len-next[len]]=q1q2,由字符串特征向量next的定义可知,q1q2q3q4q5q6=q3q4q5q6q7q8,即有q1q2=q3q4,q3q4=q5q6,q5q6=q7q8,即q1q2为循环子串,且易知为最短循环子串。由以上过程可知,若len可以被len-next[len]整除,则S存在循环子串,否则不存在。
解法:利用KMP算法,求字符串的特征向量next,若len可以被len-next[len]整除,则最大循环次数n为len/(len-next[len]),否则为1。



[code]#include<cstdio>


#include<cstring>


#include<algorithm>


usingnamespacestd;


constintmaxn=1e6;


chars[maxn+10];


intnext[maxn+10];




voidget_next(chars[],intlen)


{


inti=0,j=-1;


next[0]=-1;


while(i<len)


{


if(j==-1||s[i]==s[j]){j++;i++;next[i]=j;}


elsej=next[j];


}


}




intmain()


{


while(scanf("%s",s),s[0]!='.')


{


intlen=strlen(s);


get_next(s,len);


if(len%(len-next[len])==0)


printf("%d\n",len/(len-next[len]));


else


printf("1\n");


}


return0;


}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: