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
SampleOutput
定理:假设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]
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]
相关文章推荐
- 当前网站的mssql数据库连接数
- Nutch搜索引擎系列(目录)
- Microsoft SQL Server 管理 (常用管理及维护命令)
- java中字符串的编码解码问题
- 算法实践篇-钢条切割问题-动态规划
- 马虎的算式
- _stscanf_s (sscanf)正则表达式
- 基于AMBA-AHB总线的SDRAM控制器设计方案
- 自动化认识(三)
- 金额转换成英文描述
- Android中Bitmap,byte[],Drawable相互转化
- Oracle数据库--删除归档日志
- js中return false,return,return true的用法及差别
- Silverlight中使用Timer的方法
- AIX磁盘故障的五个场景及处理流程
- [Leetcode Solution]Insertion Sort List
- startssl 申请证书,并在Nginx, apache, Tomcat上使用
- 浅谈紫外线消毒器水力特性探讨
- OpenGL库的总结
- spring单元测试