记得初学$kmp$的时候 老师让大家把它直接背下来

然而不理解的话 不仅调试起来比较慢 很多题目也难往$kmp$上想

-----------------------------------------------------------------------

设字符串为$s$ 长度为$len$ 起始位置为$1$

首先要明白的就是 next数组的意思 便是$s[$从 $1$ 到$ i]$的后缀与$s[$从 $1$到 $i -1]$的前缀的最长公共部分长度

$($假设为$k$,则$s[$从$ 1$ 到$ i]$与$s[$从$i  -  k$ 到 $i - 1]$匹配$)$

此处可参见NOI2014动物园的题目描述$($只用看题目描述里对$next$数组的解释便可 题目无需思考$)$

于是我们便可以开始构建$next$数组了

#include <bits/stdc++.h>
using namespace std;
const int N = ;
char s[N];
int next[N];
int len;
int main()
{
scanf("%s",s + );
len = strlen(s + );
next[] = ;
int j = ;
for(int i = ;i <= len; ++i)
{
while(j && s[i] != s[j + ])j = next[j];
//不断向前寻找 直到s[从1到i]的后缀与s[从1到j+1]匹配
//之所以j=next[j]的原因是s[从1到j]的后缀与s[从1到next[j]]匹配
//不同的只是s[j+1]与s[next[j]+1] 这一点也可以解释为何只需最后一位匹配
if(s[i] == s[j + ])
next[i] = ++j;
//若匹配成功 则最长公共部分长度为n+1
else
next[i] = ;
//否则 无公共部分
}
for(int i = ;i <= len; ++i)
printf("%d ", next[i]);
}

自认为字符串下标从$1$开始 比从$0$开始 使人更易理解$next$数组的含义$($然而大部分$kmp$模板中字符串下标都是从$0$开始的$)$

最新文章

  1. mysql代码执行漏洞
  2. Django Restful Framework (二): ModelSerializer
  3. ComboBox,三级联动菜单,新入门点小白,有些代码有待优化,大神勿喷
  4. 再见,OI
  5. Javascript本质第一篇:核心概念
  6. NET Core HTTP 管道
  7. Selenium2+python自动化14-iframe
  8. (转)javaScript插件开发
  9. DTCMS列表页自定义参数。
  10. 电脑问题交流QQ群
  11. mysql设置指定ip远程访问连接实例
  12. 【安全】requests和BeautifulSoup小试牛刀
  13. Smarty 保留变量
  14. MySQLdb-python的安装
  15. Dynamics 365 Online-Virtual Entities
  16. 记录常用的adb命令
  17. jquery追加元素的不同语法
  18. Javascript-短路 与(&amp;&amp;)
  19. sqlserver 存入DB中的中文乱码
  20. win10无法访问samba共享

热门文章

  1. Decision Tree Algorithm
  2. 应用安全 - Web安全 - 逻辑漏洞整理
  3. HTML表格&lt;tr&gt;行距调整
  4. 《JAVA设计模式》之原型模式(Prototype)
  5. sqlalchemy的不区分大小写比较
  6. 简单谈谈Netty的高性能之道
  7. jvm学习(5) 对象的创建与结构
  8. Spring cloud 注册服务小结
  9. [fw]Real Mode addressing
  10. php ecshop采集商品添加规则