首页 > 其他分享 >KMP

KMP

时间:2024-07-20 14:41:39浏览次数:12  
标签:int 复杂度 后缀 真前 KMP 字符串

做法

如何判断一个字符串在另一个字符串里面出现了几次, 可以用哈希, 不过可能被 Hack 这里介绍一种总时间 \(O(N)\) 的写法

记 \(F(i)\) 表示字符串中前缀 \([1\) ~ \(i]\) 中最长真前后缀的长度

我们可以写出这样一个地推式

\(F(i) = \begin{cases}F(i - 1)&不是当前字符\\i + 1&是当前字符\end{cases}\)

另绿色的是 \(i - 1\) 的最长真前后缀, 若第一个绿色部分后面能与 \(i\) 匹配, 则最长真前后缀 = \(i - 1\) 的 $ + 1$

否则看前面的红色真前缀和真后缀最比较, 图上的红色的区间

#include<bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;

int n, m, p[N];
string s, t;

int main(){
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> s;
  n = s.size();
  s = ' ' + s;
  for(int i = 2, j = 0; i <= n; ++i){
    for(; j && s[i] != s[j + 1]; j = p[j]){
    }
    j += (s[i] == s[j + 1]);
    p[i] = j;
  }
  for(int i = 1; i <= n; ++i){
    cout << p[i] << ' ';
  }
  return 0;
}

时间复杂度

每次跳至少会让所在位置 -1, 每次最多只会让变量 +1, 每 +1 才能减一次一, 所以时间复杂度为 \(O(2n)\)

标签:int,复杂度,后缀,真前,KMP,字符串
From: https://www.cnblogs.com/liuyichen0401/p/18313056

相关文章

  • Z 函数(扩展KMP)
    author:LeoJacob,Marcythm,minghu6约定:字符串下标以\(0\)为起点。定义对于一个长度为\(n\)的字符串\(s\),定义函数\(z[i]\)表示\(s\)和\(s[i,n-1]\)(即以\(s[i]\)开头的后缀)的最长公共前缀(LCP)的长度,则\(z\)被称为\(s\)的Z函数。特别地,\(z[0]=0\)。国外一......
  • 扩展 KMP/exKMP(Z 函数)学习笔记
    声明本文章转载自shangruolin的博客,已经过作者(存疑)同意,帮TA宣传一下。扩展KMP/exKMP(Z函数)学习笔记兼P10479匹配统计题解。LCP:最长公共前缀。Z函数,又称扩展KMP(exKMP),能够在\(O(n)\)的时间内求出一个字符串与其所有后缀的LCP的长度。定义\(z_i\)为字符串\(s\)......
  • KMP+状态转移
    题目:你现在需要设计一个密码S,S需要满足:S的长度是N;S只包含小写英文字母;S不包含子串T;请问共有多少种不同的密码满足要求?由于答案会非常大,请输出答案模1e9+7的余数。输入格式:第一行输入整数N,表示密码的长度。第二行输入字符串T,T中只包含小写字母。输出格式:输出一个......
  • KMP
    CF1326D2Prefix-SuffixPalindrome(Hardversion)给你一个由小写英文字母组成的字符串\(s\)。请找出满足以下条件的最长字符串\(t\):\(t\)的长度不超过\(s\)的长度。\(t\)是一个回文字符串。存在两个字符串\(a\)和\(b\)(可能为空),使得\(t=a+b\)("\(+\)"表......
  • KMP算法
    KMP算法KMP算法是一个字符串算法,通常用于匹配字符串。KMP算法的原理如果我们暴力枚举下标\(i,j\),\(i\)是文本串的下标,\(j\)是模式串(你要在文本串中匹配的字符串)的下标,时间复杂度\(O(NM)\),其中\(N,M\)分别为文本串和模式串的长度。我们看一下匹配过程:(gif动图请耐心观看)......
  • KMP算法
    KMP算法KMP算法是一个字符串算法,通常用于匹配字符串。KMP算法的原理如果我们暴力枚举下标\(i,j\),\(i\)是文本串的下标,\(j\)是模式串(你要在文本串中匹配的字符串)的下标,时间复杂度\(O(NM)\),其中\(N,M\)分别为文本串和模式串的长度。我们看一下匹配过程:(gif动图请耐心观看)......
  • 【算法篇】KMP算法,一种高效的字符串匹配算法
    我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!!KMP算法的基本概念KMP算法是一种高效的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。该算法的主要使用场景就是在字符串(也叫主......
  • KMP算法实例——模式匹配
    题目描述:给定两个字符串,一个是文本串txt,另一个是模式串pat。请使用KMP算法找出模式串在文本串中的所有出现位置。示例输入:文本串 txt:"ABABDABACDABABCABAB"模式串 pat:"ABABCABAB"#include<stdio.h>#include<string.h>//计算模式串的最长公共前后缀数组voidco......
  • 【漏洞复现】金斗云 HKMP智慧商业软件 任意用户创建漏洞
    0x01产品简介金斗云智慧商业软件是一款功能强大、易于使用的智慧管理系统,通过智能化的管理工具,帮助企业实现高效经营、优化流程、降低成本,并提升客户体验。无论是珠宝门店、4S店还是其他零售、服务行业,金斗云都能提供量身定制的解决方案,助力企业实现数字化转型和智能化升......
  • 代码随想录算法训练营Day9 | 字符串 151.翻转字符串单词 28.实现strStr() KMP算法介绍
    python中常用:        s[::-1]: 反转整个字符        s.strip():删除开头或结尾处的空白字符     s.split():字符拆分成单词 →list    “”.join(s):list→字符串   (持续更新…) 151.翻转字符串里的单词 题目: Leetcod......