https://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 参考了这个ppt 理解起来还是有点费劲的(还是推荐一下这个课件 里面概念和思路给的比较全)

关键点 在extend[1...k]都已经求出来的情况下,求extend[k]。

关键利用s中有一部分和t相等。extend[k+1]的长度<=(s和t相等部分长度时候) extend[k+1]=next[k-a+1];

否者超出的部分要一一匹配并更新,a,p;

上个板子:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#define mt(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
const ll mod=1e9+;
ll extend[];
ll Next[];
ll min(ll x,ll y)
{
if(x>y) return y;
return x;
}
void getNext(string t)
{
mt(Next);
ll len=t.length();
Next[]=len;
ll a,p;
a=;
while( a<len && t[a]==t[a-]) a++; // 求出长度为1的时候 解为多少
Next[]=a-;
a=;
for(ll i=;i<len;i++) // 后续的按照算法来就好
{
p=a+Next[a]-;
if((i-)+Next[i-a] < p ) Next[i]=Next[i-a];// 第一种情况 没有超过等于的部分
else // 超过的话就不好直接用next的定义 需要后续的遍历
{
ll j = (p - i + ) > ? (p - i + ) : ;
while(i + j < len && t[i+j] == t[j]) j++;
Next[i]=j;
a=i;
}
}
}
void exkmp(string s,string t) // s->extend t->next
{
getNext(t);
ll a,p;//
ll slen=s.length();
ll tlen=t.length();
a=p=;
ll len=min(s.length(),t.length());
while(p<len && t[p]==s[p]) p++; // after
extend[]=p;
for(ll i=;i<slen;i++)
{
p=a+extend[a]-; // update
if( (i-)+Next[i-a] < p) extend[i]=Next[i-a];
else
{
ll j = (p - i + ) > ? (p - i + ) : ;
while( j < tlen && i+j < slen && s[i + j] == t[j]) j++;
extend[i]=j;
a=i;
}
}
}
// 核心 一个起始位置a 一个最远匹配位置p 然后Next 和 extend数组
int main()
{
string s,t;// s->exkmp t->Next
int Case;
scanf("%d",&Case);
while(Case--)
{
cin>>s>>t;
exkmp(s,t); }
return ;
}

扩展kmp入门+比赛模板的更多相关文章

  1. luogu P5410 模板 扩展 KMP Z函数 模板

    LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...

  2. KMP和扩展KMP【转】

    这种东西基本上在纸上自己推导一下就能做出来XD 转发注明出处 KMP 给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i] (0<=i ...

  3. 字符串KMP——用途广泛的字符串匹配算法 + 扩展KMP——特殊定义的字符串匹配

    引 入 引入 引入 " SY 和 WYX 在看毛片.(几 毛 钱买到的动作 片,毛 片) WYX 突然想回味一个片段,但是只记得台词里面有一句挺长的 " ∗ ∗ ∗ ∗ **** ...

  4. 字符串匹配--扩展KMP模板

    对于一个字符串 s 以及子串 t ,扩展KMP可以用来求 t 与 s 的每个子串的最长公共前缀 ext [ i ],当然,如果有某个 ext 值等于 t 串的长度 lent ,那么就说明从其对应的 i ...

  5. kmp模板 && 扩展kmp模板

    kmp模板: #include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; ...

  6. (模板)扩展kmp算法(luoguP5410)

    题目链接:https://www.luogu.org/problem/P5410 题意:有两个字符串a,b,要求输出b与a的每一个后缀的最长公共前缀.输出: 第一行有lenb个数,为b的next数组( ...

  7. P5410 【模板】扩展 KMP

    P5410 [模板]扩展 KMP #include<bits/stdc++.h> using namespace std; ; int q, nxt[maxn], extend[maxn] ...

  8. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  9. Manacher模板,kmp,扩展kmp,最小表示法模板

    *N]; //储存临时串 *N];//中间记录 int Manacher(char tmp[]) { int len=strlen(tmp); ; ;i<len;i++) { s[cnt++]= ...

随机推荐

  1. 最简陋的python数据

    python 爬虫 最简陋的第一次爬取写入CSV文件(只是想纪念一下,以后看看现在自己多年轻) github

  2. PyTorch Tutorials 5 数据并行(选读)

    %matplotlib inline 数据并行(选读) Authors: Sung Kim and Jenny Kang 在这个教程里,我们将学习如何使用 DataParallel 来使用多GPU. ...

  3. OpenSL ES: OpenSL ES 简介

    1. OpenSL ES 是什么 OpenSL ES (Open Sound Library for Embedded Systems)是无授权费.跨平台.针对嵌入式系统精心优化的硬件音频加速API. ...

  4. 跨平台免费极简的markdown工具

    1. 工具名 typora 2. 工具官网 https://www.typora.io

  5. Redis搭建集群

  6. 阶段5 3.微服务项目【学成在线】_day18 用户授权_13-细粒度授权-细粒度授权介绍

    3 细粒度授权 3.1 需求分析 什么是细粒度授权? 细粒度授权也叫数据范围授权,即不同的用户所拥有的操作权限相同,但是能够操作的数据范围是不一样的.一个 例子:用户A和用户B都是教学机构,他们都拥有 ...

  7. python之socket编程(二)

    标签(空格分隔): socket编程 SocketServer解析 SocketServer内部使用I/O多路复用,多线程,多进程来实现客户端多并发访问Socket服务端,while循环时使用I/O多 ...

  8. 容器版单个jenkins实现CI/CD----带solo博客开源项目

    实验架构: 192.168.0.96 gitlab 192.168.0.97 jenkins.docker-1.7 192.168.0.98 harbor.docker-1.7集群 jenkins安装 ...

  9. linux下的进程通信之信号量semaphore

    概念: IPC 信号量和内核信号量非常相似,是内核信号量的用户态版本. 优点:每个IPC信号量可以保护一个或者多个信号量值的集合,而不像内核信号量一样只有一个值,这意味着同一个IPC资源可以保护多个独 ...

  10. Azure Web应用相关设置

    这里用来记录自己在工作中,在Azure Web应用中用到的配置 设置NodeJS版本 Azure Web应用默认的NodeJS版本是0.10.4,这个版本太低,不能满足实际的需要 参照下图修改,根据自 ...