记得初学$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$开始的$)$

KMP算法中next数组的构建的更多相关文章

  1. KMP算法中next数组的理解与算法的实现(java语言)

    KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧. 计算前缀 Next[i] 的值: ...

  2. 字符串匹配KMP算法中Next[]数组和Nextval[]数组求法

    数据结构课本上给了这么一段算法求nextval9[]数组 int get_nextval(SString T,int &nextval[ ]) { //求模式串T的next函数修正值并存入数组 ...

  3. hdu 1358:Period(KMP算法,next[]数组的使用)

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. 问题 1690: 算法4-7:KMP算法中的模式串移动数组

    题目链接:https://www.dotcpp.com/oj/problem1690.html 题目描述 字符串的子串定位称为模式匹配,模式匹配可以有多种方法.简单的算法可以使用两重嵌套循环,时间复杂 ...

  5. KMP算法中求next数组的实质

    在串匹配模式中,KMP算法较蛮力法是高效的算法,我觉得其中最重要的一点就是求next数组: 看了很多资料才弄明白求next数组是怎么求的,我发现我的忘性真的比记性大很多,每次看到KMP算法求next数 ...

  6. KMP算法中我对获取next数组的理解

    之前在学KMP算法时一直理解不了获取next数组的函数是如何实现的,现在大概知道怎么一回事了,记录一下我对获取next数组的理解. KMP算法实现的原理就不再赘述了,先上KMP代码: 1 void g ...

  7. KMP 算法中的 next 数组

    KMP 算法中对 next 数组的理解 next 数组的意义 此处 next[j] = k:则有 k 前面的浅蓝色区域和 j 前面的浅蓝色区域相同: next[j] 表示当位置 j 的字符串与主串不匹 ...

  8. KMP算法的next[]数组通俗解释

    原文:https://blog.csdn.net/yearn520/article/details/6729426 我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以 ...

  9. hdu3336解读KMP算法的next数组

    查看原题 题意大致是:给你一个字符串算这里面全部前缀出现的次数和.比方字符串abab,a出现2次.ab出现2次,aba出现1次.abab出现1次.总计6次. 而且结果太大.要求对1007进行模运算. ...

随机推荐

  1. upc组队赛17 Bits Reverse【暴力枚举】

    Bits Reverse 题目链接 题目描述 Now given two integers x and y, you can reverse every consecutive three bits ...

  2. error LNK2019: unresolved external symbol __vsnwprintf

    老DX SDK,新VS2019问题,编译老项目GG,依赖库加入 legacy_stdio_definitions.lib 解决

  3. EasyUI的datagrid列属性添加超链接

    $("#dg").datagrid({        url: "../Ajax/PurchaseAjax.ashx",        queryParams: ...

  4. C# InterLock保证数据一致性

        ; i < ; i++)             {                 c.Increment();                 c.Decrement();      ...

  5. SpringBoot项目FatJar同War之间的相互转换

    目录 1.原有的项目结构 修改后的项目结构 常见的dependency的scope 1.原有的项目结构 启动类 @SpringBootApplication(exclude = {DataSource ...

  6. web调试代理工具Whistle

    由于最近在学习微信小程序开发,项目中用到了https代理请求,所以用到了基于Node实现的跨平台web调试代理工具Whistle,在此做一记录. 完成https代理请求总共需要5个步骤. 一.安装No ...

  7. Java arraylist重复使用问题

    arraylist同一个实例重复使用时,需要使用clear()及时清空,否则会在上次的结果后面添加项. List<Double> weightsList = new ArrayList&l ...

  8. UVAlive 6763 Modified LCS

    LCS stands for longest common subsequence, and it is a well known problem. A sequence in thisproblem ...

  9. CodeForces 711D Directed Roads (DFS找环+组合数)

    <题目链接> 题目大意: 给定一个$n$条边,$n$个点的图,每个点只有一条出边(初始状态),现在能够任意对图上的边进行翻转,问你能够使得该有向图不出先环的方案数有多少种. 解题分析: 很 ...

  10. P5459 [BJOI2016]回转寿司

    传送门 暴力怎么搞,维护前缀和 $s[i]$ ,对于每一个 $s[i]$,枚举所有 $j\in[0,i-1]$,看看 $s[i]-s[j]$ 是否属于 $[L,R]$ 如果属于就加入答案 $s[i]- ...