kmp的代码很短,但是不太容易理解,还是先说明一下这个算法过程吧。

朴素的字符串匹配大家都懂,但是效率不高,原因在哪里?

匹配过程没有充分利用已经匹配好的模版的信息,比如说,

i是文本串当前字符的下标,j是要匹配的模版串当前正在匹配的字符的下标。(下标都从零开始,j同时可以表示已经匹配的字符长度)

当匹配到i = 4, j = 4的时候失配了,朴素的匹配做法是往右边移一位然后从j开始扫,这样做效率很低。

不难发现前面已经匹配好的串ab是最长公共前缀后缀。把串移动到后缀的第一个位置正好是

朴素的匹配过程中第一次匹配能把这个前缀匹配匹配完的位置!因此令j = f[j-1] = 2。

模版串下面这个f数组又是怎么来的呢?

寻找最长公共前缀后缀过程本质上也是一个匹配。

i表示当前要求f[i]的下标,j表示之前串已经匹配的最大前缀后缀长度。(j = -1表示0号位置也没有匹配上)

当i = 6时,之前已经匹配了j个,所以只要i只要从j下标位置开始比较就行了。当匹配的时候f[i] = j+1。

如果不匹配,利用前面已经得到的f值进行匹配。

当i = 7, j = 3时,发生失配,利用之前的f值,可以知道a是最长的前缀和后缀,那么只需要从a开始匹配,因此令j = f[j-1],

重复上述过程直到匹配或j = -1的时候为止。当前就等于: f[i] = j+1。(j=-1表示没有匹配也是为了方便统一处理)

在代码中,因为当j = 0的时候,j = f[j-1]不好表示,因此把整个f数组向右边移动一位。此时只需把上述过程的j = f[j-1]替换成j = f[j]。

----------------------------------------------分割线----------------------------------------------------------------

这道题要求前缀的最小循环周期。

先构造一个循环的串,然后进行求失配函数f的过程,当第一次前缀长度等于后缀长度并且各占一半的时候,这个前缀一定是最小的循环节。(从第一个结论开始用归纳法证明)

可以归纳出一个结论:在每个循环节终止的位置 i-f[i] ==最短循环节长度。

反过来i能被(i-f[i])整除可以推出i-f[i]是最短循环节。(同样用归纳法)

kmp之前不太理解,只会套。为学习ac自动机,先把的kmp基础打好。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+;
int f[maxn];
char str[maxn]; void getF(char *s)
{
f[] = -;
for(int i = , j = -; s[i]; ){
while(~j && s[i] != s[j]) j = f[j];
f[++i] = ++j;
}
} int main()
{
//freopen("in.txt","r",stdin);
int n,kas = ;
while(scanf("%d\n",&n),n){
gets(str);
getF(str);
printf("Test case #%d\n",++kas);
for(int i = ; i <= n; i++){
if(f[i] && i%(i-f[i]) == )
printf("%d %d\n",i,i/(i-f[i]));
}
putchar('\n');
}
return ;
}

最新文章

  1. android笔记:获取View组件宽度以及ViewTreeObserver
  2. 引用js或css后加?v= 版本号的用法
  3. 如何通过JavaScript构建Asp.net服务端控件
  4. Wcf:可配置的服务调用方式
  5. (2016弱校联盟十一专场10.2) A.Nearest Neighbor Search
  6. js的一些小笔记,(不定期更新)
  7. Teehan &amp; Lax 发布 iOS 7 GUI PSD 模板,免费下载
  8. [zz] JIT&amp;HotSpot
  9. 安装windows系统(win7)
  10. BZOJ 1003: [ZJOI2006]物流运输trans(最短路+dp)
  11. ArrayList集合--C#
  12. iOS6和iOS7适应代码(6) —— NSLocalizedString
  13. 【开发技术】视频URL采集
  14. 安装gitlab8.0在reconfigure报错
  15. 2018-2019-2 网络对抗技术 20165232 Exp4 恶意代码分析
  16. 防xss攻击
  17. ViewPager + TabLayout + Fragment + MediaPlayer的使用
  18. js 第三期 小肩膀 第一段
  19. element-UI——el-table添加序号
  20. 转:Command &quot;python setup.py egg_info&quot; failed with error code 1 in /tmp/pip-install-j8m0mf5q/mysqlclient

热门文章

  1. Sharepoint2013搜索学习笔记之设置sharepoint网站内容源(五)
  2. CRC原理总结
  3. tar,jar和war都是什么
  4. python3编程技巧二——如何在列表、字典、集合 中根据条件筛选数据
  5. centos6上安装CDH5.7
  6. 微信站 - 实现复制功能 clipboard
  7. jqeury实现全选和反选
  8. Codeforces 140F(坐标系点对称)
  9. 作用域提升(Scope Hositing )是 Webpack 3 的标志性特征
  10. (转)Mysql数据库之Binlog日志使用总结CentOS 7.x设置自定义开机启动,添加自定义系统服务