拓展KMP以及模板
废话不多说,上模板
#include<bits/stdc++.h>
;
int Next[maxn], extend[maxn], moL, strL;///Next数组、extend数组、模式串长度、母串长度
char mo[maxn], S[maxn];///模式串、母串
void GetNext()///求解模式串 mo 的 Next 数组
{
Next[] = moL;
int a, p;
, j = -; i < moL; i++, j--){
|| i + Next[i - a] >= p){
) p = i, j = ;
while (p < moL && mo[p] == mo[j]) p++, j++;
Next[i] = j;
a = i;
} else Next[i] = Next[i - a];
}
}
void GetExtend()///模式串 mo 对主串 S 求解 extend 数组
{
GetNext();
int a, p; ///记录匹配成功的字符的最远位置p,及起始位置a
, j = -; i < strL; i++, j--){ ///j即等于p与i的距离,其作用是判断i是否大于p(如果j<0,则i大于p)
if (j < 0 || i + Next[i - a] >= p){ ///i大于p(其实j最小只可以到-1,j<0的写法方便读者理解程序)
if (j < 0) p = i, j = 0; ///如果i大于p
while (p < strL && j < moL && S[p] == mo[j])
p++, j++;
extend[i] = j;
a = i;
} else extend[i] = Next[i - a];
}
}
Template
本文实际就是为了记录一下较好的拓展KMP资料...........
问题提出 : 给出子串以及母串,我们定义extend[i]表示从母串的第 i 字符开始到最后(也就是从 i 位置开始的后缀 )与子串的最长公共前缀长度,现在要求在线性时间内对于母串的所有位置求出extend值即extend[ 0~strlen(母串)-1 ]
参考 : 在网上看了好多博客,都不能看的非常明白,直到遇到这个图文并茂的博客,强烈推荐 ==> 点我
完了嘛?嗯,完了……
拓展KMP以及模板的更多相关文章
- 拓展kmp模板
算法描述:设字符串T,长度为n,字符串S,长度为m.在线性时间内求出T的每一个后缀所对应S的最长前缀. 假设T=“AAAAB”,S="AAAA". //拓展KMP ; //字符串长 ...
- 拓展KMP算法详解
拓展KMP解决的问题是给两个串S和T,长度分别是n和m,求S的每一个后缀子串与T的最长公共前缀分别是多少,记作extend数组,也就是说extend[i]表示S[i,n-1](i从0开始)和T的最长公 ...
- KMP&拓展KMP
KMP算法 说明 KMP算法是一种比较高效的字符串匹配算法,可以在线性时间内求出一个串在另一个串的所有匹配位置. 解析 详解KMP 设模板串是 \(pattern\) 令 \(next[i] = ma ...
- HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...
- HDU 4300 Clairewd's message ( 拓展KMP )
题意 : 给你一个包含26个小写字母的明文密文转换信息字符串str,第一个表示'a'对应的密文是str[0].'b'对应str[1]……以此类推.接下来一行给你一个另一个字符串,这个字符串由密文+明文 ...
- hdu-4300(kmp或者拓展kmp)
题意:乱七八糟说了一大堆,就是先给你一个长度26的字符串,对应了abcd....xyz,这是一个密码表.然后给你一个字符串,这个字符串是不完整的(完整的应该是前半部分是加密的,后半部分是解密了的),然 ...
- hdu-4763(kmp+拓展kmp)
题意:给你一个串,问你满足最大字串既是前后缀,也在字符串除去前后缀的位置中出现过: 思路:我用的是拓展kmp求的前后缀,只用kmp也能解,在字符串2/3的位置后开始遍历,如果用一个maxx保存前2/3 ...
- poj-2752(拓展kmp)
题意:求一个串所有的前后缀字串: 解题思路:kmp和拓展kmp都行,个人感觉拓展kmp更裸一点: 拓展kmp: #include<iostream> #include<algorit ...
- hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)
传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...
随机推荐
- 应用安全 - 工具 | 数据库 - redis - 漏洞 - 汇总
未授权访问 Date 类型 未授权访问导致getshell 影响范围 复现 (1)shell反弹 (2)结合SSH服务 (3)结合web服务 分析
- 【Linux开发】Ubuntu下几个软件的配置记录backup
调用ubuntu命令行的方法:ctrl+alt+t gcc -o test test.c 开发工具包括eclipse,Qt等全部放入了/opt/路径下,java开发环境放在了/usr/local/jd ...
- netcore 使用redis session 分布式共享
首先准备redis服务器(docker 和redis3.0内置的哨兵进行高可用设置) 网站配置Redis作为存储session的介质(配置文件这些略).然后可以了解一下MachineKey这个东西.( ...
- list 转 map java8
// Arrays.asList("a:1.0", "b:2.0", "c:3.0") --> Map {a=1.0, b=2.0, ...
- exosip2 build
Build eXosip on Win 1. download exosip http://savannah.nongnu.org/projects/exosip/ 2. download libc ...
- Thinkphp3.2 Redis支持REDIS_AUTH验证
原有的Redis类在Library/Think/Cache/Driver/中 换成下面的: <?php // +----------------------------------------- ...
- MinGW的安装
我在MinGW官网下载到的版本是mingw-w64-install.exe,不过这差不多是一年以前的事了…… 安装路径:D:\Program Files (x86)\mingw-w64\i686- ...
- MySql+EF+CodeFirst
ef+mssql详细是许多.net程序员的标配.作为一个程序员当然不能只会mssql这一个数据库,今天简单聊聊ef+mysql.推荐新人阅读. 1]首先创建一个mvc项目,如图: 创建完毕之后再nug ...
- 执行npm publish 报错:403 Forbidden - PUT https://registry.npmjs.org/kunmomotest - you must verify your email before publishing a new package: https://www.npmjs.com/email-edit
前言 执行npm publish 报错:403 Forbidden - PUT https://registry.npmjs.org/kunmomotest - you must verify you ...
- C/C++ 递归
递归 当一个函数调用它自己来定义时称它为递归函数.(什么叫它自己调用它自己呢?) 1.1.引出递归 从一个简单的问题考虑递归,求0,1,2, 3,4,5......n的和. 首先定义一个求和公式:su ...