acm专题---KMP模板
KMP的子串长n,模式串长m,复杂度o(m+n),朴素做法的复杂度o((n-m+1)*m)
觉得大话数据结果上面这个讲得特别好





改进版本的KMP



leetcode
28. Implement strStr()
class Solution {
public:
void getnext(string str,int next[])
{
int i=1;
int j=0;
next[1]=0;
int str0=str.length()-1;
while(i<=str0)
{
if(j==0||str[i]==str[j])
{
++j;
++i;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int kmp(string s,string t)
{
int cnt=0;
//int *next=new int[1000002];
int next[1000002];
getnext(t,next);
int i=1;
int j=1;
int s0=s.length()-1,t0=t.length()-1;
int idx=-1;
while(i<=s0&&j<=t0)
{
if(j==0||s[i]==t[j])
{
++i;
++j;
}
else
{
j=next[j];
}
if(j>t0)
{
cnt++;
idx=i-t0-1;
break;
}
}
return idx;
}
int strStr(string haystack, string needle) {
if(haystack.length()==0&&needle.length()<=haystack.length()||needle.length()==0) return 0;
string tmpt="#",tmps="#";
tmpt+=needle;
tmps+=haystack;
return kmp(tmps, tmpt);
}
};
class Solution {
public:
void getnext(string str,int next[])
{
int i=1;
int j=0;
next[1]=0;
int str0=str.length()-1;
while(i<=str0)
{
if(j==0||str[i]==str[j])
{
++j;
++i;
if(str[i]!=str[j])
next[i]=j;
else
next[i]=next[j];
}
else
{
j=next[j];
}
}
}
int kmp(string s,string t)
{
int cnt=0;
//int *next=new int[1000002];
int next[1000002];
getnext(t,next);
int i=1;
int j=1;
int s0=s.length()-1,t0=t.length()-1;
int idx=-1;
while(i<=s0&&j<=t0)
{
if(j==0||s[i]==t[j])
{
++i;
++j;
}
else
{
j=next[j];
}
if(j>t0)
{
cnt++;
idx=i-t0-1;
break;
}
}
return idx;
}
int strStr(string haystack, string needle) {
if(haystack.length()==0&&needle.length()<=haystack.length()||needle.length()==0) return 0;
string tmpt="#",tmps="#";
tmpt+=needle;
tmps+=haystack;
return kmp(tmps, tmpt);
}
};
acm专题---KMP模板的更多相关文章
- kuangbin专题16B(kmp模板)
题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...
- kuangbin专题16A(kmp模板)
题目链接: https://vjudge.net/contest/70325#problem/A 题意: 有两个数组 a, b, 输出 b 数组在 a 数组中的第一个匹配位置, 不能匹配则输出 -1. ...
- HDU 1711 - Number Sequence - [KMP模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- HDU 1711 Number Sequence(KMP模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1711 这道题就是一个KMP模板. #include<iostream> #include<cs ...
- ACM赛前准备——模板(排版篇)
ACM赛前准备--模板(排版篇) 更新 前言 效果演示 封面 目录页 模板页(不分栏) 模板页(分栏) 结果文件 快速使用 准备工作 安装TexLive (可选)安装minted包 创建模板 文件结构 ...
- 剪花布条---hdu2087(kmp模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...
- hdu 1686 KMP模板
// hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...
- Oulipo HDU 1686 KMP模板
题目大意:求模式串在主串中的出现次数. 题目思路:KMP模板题 #include<iostream> #include<algorithm> #include<cstri ...
- KMP模板(bin)
KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...
随机推荐
- Docker入门与应用系列(二)镜像管理
1.1 什么是镜像 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 1.2 镜像从哪里来 Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...
- 解决Pytohn安装第三方库出现read timed out 问题
输入pip --default-timeout=100 install -U Packages 如pip --default-timeout=100 install -U Pillow
- SMO详解
转自:简书https://www.jianshu.com/p/55458caf0814 SVM通常用对偶问题来求解,这样的好处有两个:1.变量只有N个(N为训练集中的样本个数),原始问题中的变量数量与 ...
- 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍
简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...
- python学习笔记2-dict
常用的dict操作: d={'name':'suki', ', 'sex':'man', 'addr':'nanjing' } #字典取值方便,但是字典是没有顺序的,List有下标 print(d[' ...
- Java并发编程原理与实战十三:JDK提供的原子类原理与使用
原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 原子更新基本类型: package com.roocon.thread.t8; import java.util.concurren ...
- PyQt4 里的表格部件的使用方法: QTableWidget
PyQt4 里的表格部件的使用方法: QTableWidget QT下QTableWidget使用方法小结 - - 博客频道 - CSDN.NET http://blog.csdn.net/jingz ...
- Swiper点击后自动轮播停止情况
用户操作swiper之后,是否禁止autoplay.默认为true:停止. 如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay. 操作包括触碰,拖动,点击 ...
- github 新创建repositories
1. 在github上新建repo 2. 找到改repo的地址,用命令git clone https://...., 拉取到本地 3. 打开一个单独的窗口,打开此文件夹 4. 创建自己的python ...
- 什么是EOF -- 转
转载地址:http://www.ruanyifeng.com/blog/2011/11/eof.html 我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示&quo ...