字符串
字符串匹配问题
在字符串s中查找某个字符串p是否出现
朴素做法
枚举s中每个长度为m的子串,然后判断这些子串和p一不一样
怎么判断一不一样?
- 一位一位比较,这时总的复杂度为\(O(nm)\)
- 字符串哈希优化,使用哈希可以做到\(O(n+m)\)的时间复杂度
- KMP用线性复杂度解决字符串匹配问题

现在把i向右移动一位会怎样?
- j不等于m且s[i+1]和p[j+1]一样,j也向右移动一位
- 否则j向前回到满足串s[i-k+1]$\dots$s[i]和p[1]$\dots$p[k]完全相等,且k的值最大的位置,然后继续判断
- 如果s[i+1]和p[j+1]仍不相同,则不停前退直至s[i+1]和p[j+1]相同或者j等于0为止
如何快速求出k?
- k与s无关
- 我们要求的就是最大的k满足k<j,使得p[1]\(\dots\)p[k]和p[j-k+1]\(\dots\)p[j]完全相同
- 使用next数组维护每个j对应的k
例题

```cpp
#include
#include
#include
#include
#include
#include
#include
#include