KMP算法解题模板(更新)
/*
kmp算法的主要作用在于对next数组的运用,所以这里只给出next数组的模板
性质1:对于每一个长度len的子串,该子串的最小循环节为len-next[len]
性质2:kmp的next不断向前递归的过程可以保证对于每一个当前前缀,都有一段后缀与之对应
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e6+5;
int Next[maxn];
char mo[maxn];
int n2;
void GetNext() {
int i = 0, j = -1;
while (i < n2) {
if(j == -1 || mo[i] == mo[j]) {
i++;
j++;
Next[i] = j;
} else j = Next[j];
}
return;
}
int main() {
cin >> mo;
n2 = strlen(mo);
Next[0] = -1;
GetNext();
return 0;
}
/*
kmp模板
题意就是求B串在A串中的第一次匹配的下标,(从1开始)
str就是A,mo就是B
*/
#include<bits/stdc++.h>
using namespace std ;
const int maxn = 1e6+5;
int Next[maxn], n1, n2;
char str[maxn], mo[maxn];
void GetNext() {
int i = 0, j = -1;
while(i < n2) {
if(j == -1 || mo[i] == mo[j]) {
i++;
j++;
Next[i] = j;
} else j = Next[j];
}
return;
}
int kmp() {
int cnt = 0;
int i = 0, j = 0;
while(i < n1) {
if(j == -1 || str[i] == mo[j]) {
i++;
j++;
} else j = Next[j]; //next数组寻找与当前后缀匹配最长的前缀,省略不必要的查找
if(j == n2) return i - n2 + 1; //首地址
}
return -1;
}
int main() {
cin >> str >> mo;
n1 = strlen(str);
n2 = strlen(mo);
Next[0] = -1;
GetNext();
cout << kmp() << endl;
return 0;
}
/*
kmp模板
题意就是求B串在A串中的出现次数(可重叠
str就是S,mo就是B
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int Next[maxn], n1, n2;
char str[maxn], mo[maxn];
void GetNext() {
int i = 0, j = -1;
while(i < n2) {
if(j == -1 || mo[i] == mo[j]) {
i++;
j++;
Next[i] = j;
} else j = Next[j];
}
return;
}
int kmp() {
int cnt = 0;
int i = 0, j = 0;
while(i < n1) {
if (j == -1 || str[i] == mo[j]) {
i++;
j++;
} else j = Next[j];
if(j == n2) {
cnt++;
j=Next[j]; //完成一次匹配,将j移动到最长的前缀处,省略不必要的查找
}
}
return cnt;
}
int main() {
cin >> str >> mo;
n1 = strlen(str);
n2 = strlen(mo);
Next[0] = -1;
GetNext();
cout << kmp() << endl;
return 0;
}
/*
kmp模板
题意就是求B串在A串中的出现次数(不可重叠
str就是A,mo就是B
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int Next[maxn], n1, n2;
char str[maxn], mo[maxn];
void GetNext() {
int i = 0, j = -1;
while (i < n2) {
if (j == -1 || mo[i] == mo[j]) {
i++;
j++;
Next[i] = j;
} else j = Next[j];
}
return;
}
int kmp() {
int cnt = 0;
int i = 0, j = 0;
while (i < n1) {
if (j == -1 || str[i] == mo[j]) {
i++;
j++;
} else j = Next[j];
if (j == n2) {
cnt++;
j = 0;
}
}
return cnt;
}
int main() {
cin >> str >> mo;
n1 = strlen(str);
n2 = strlen(mo);
Next[0] = -1;
GetNext();
cout << kmp() << endl;
return 0;
}
/*
最小循环节 POJ 2406 Power Strings
结论:如果len%(len-nxt[len])=0,那么循环次数为len/(len-nxt[len]),否则为1
*/
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000100];
int nxt[1000100];
void get_nxt(){
int len = strlen(s);
nxt[0] = -1;
int i = 0, j = -1;
while (i < len){
if (j == -1 || s[i] == s[j]){
i++, j++;
nxt[i] = j;
}
else j = nxt[j];
}
}
int main(){
//freopen("in.txt", "r", stdin);
while (scanf("%s", s)){
int len = strlen(s);
if (len == 1 && s[0] == '.')break;
get_nxt();
int ans = len % (len - nxt[len]) == 0 ? len / (len - nxt[len]) : 1;
printf("%d\n", ans);
}
return 0;
}
KMP算法解题模板(更新)的更多相关文章
- KMP算法(——模板习题与总结)
KMP算法是一种改进的模式匹配算法,相比于朴素的模式匹配算法效率更高.下面讲解KMP算法的基本思想与实现. 先来看一下朴素模式匹配算法的基本思想与实现. 朴素模式匹配算法的基本思想是匹配过程中如果该位 ...
- KMP算法(模板)
话说kmp真的挺难理解的,花了挺大功夫的,恩,找了段好理解的代码,做模板了 int KMP(char *s,char *p){ int ans = -1; nex[0] = 0; int lenp = ...
- KMP算法_模板_C++
这个博客讲得非常优秀,可惜它是Java版本的 http://blog.csdn.net/yutianzuijin/article/details/11954939/ a 为匹配串,b 为目标串 通俗讲 ...
- 【kmp算法】模板
void GetFail(char P[],int __next[])//__next[i]表示s[0]~s[i-1]的前缀中,最大长度相等的前后缀是多少 { __next[0]=-1; int le ...
- 信息竞赛进阶指南--KMP算法(模板)
next[1] = 0; for (int i = 2, j = 0; i <= n; i++) { while (j > 0 && a[i] != a[j+1]) j = ...
- 串的模式之kmp算法实践题
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- [模板]KMP算法
昨天晚上一直在调KMP(模板传送门),因为先学了hash[关于hash的内容会在随后进行更(gu)新(gu)]于是想从1开始读...结果写出来之后一直死循环,最后我还是改回从0读入字符串了. [预先定 ...
- KMP算法模板&&扩展
很不错的学习链接:https://blog.csdn.net/v_july_v/article/details/7041827 具体思路就看上面的链接就行了,这里只放几个常用的模板 问题描述: 给出字 ...
随机推荐
- hbuilder打包app基本流程
声明:本文可能用到一些工具和第三方网站,都是为了达到目的而使用的工具,绝不含有广告成分 1.下载.最新的Hbuilder X貌似不能直接创建移动app了(自己不会用),建议旧版.可去腾某讯软件中心下载 ...
- 开会不用把人都轰进一个小黑屋子——《Office妖精是怎样炼成的》续2
<Office妖精是怎样炼成的>http://blog.sina.com.cn/s/articlelist_1446470001_6_1.html 一本不是技术图书却含有技术内容的图书,一 ...
- 误入 GitHub 游戏区,意外地收获颇丰
这天中午,我和往常一样就着美食视频吃完午饭,然后起身泡了一杯"高沫". 我闻着茶香享受着午后的阳光,慵懒地坐在工位上习惯性的打开 GitHub 游荡,酝酿着睡意. 误打误撞,我来到 ...
- LuoguP7869 「Wdoi-4」使用三个系统程度的能力 题解
Content 现在有一个转换后的文本文件,以一个长度为 \(n\) 的字符串表示.请判断这个文件是用哪一种写的,详情请返回题面. 数据范围:\(n\leqslant 10^5\).字符串里面至少有一 ...
- Asp.Net Core基础篇之:白话管道中间件
在Asp.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景 ...
- springboot整合阿里云视频点播接口
官方SDK文档地址: https://help.aliyun.com/document_detail/57756.html?spm=a2c4g.11186623.6.904.4e0d3bd9VbkIC ...
- Miniconda入门教程
Miniconda 教程 介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.因为包含了大量的科学包,Anaconda 的下载文件 ...
- Brute-force Algorithm(hdu3221)
Brute-force Algorithm Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 全网连夜修复的Log4j漏洞,如何做到一行代码都不改?
GitHub 21.5k Star 的Java工程师成神之路,不来了解一下吗! GitHub 21.5k Star 的Java工程师成神之路,真的不来了解一下吗! Apache Log4j2 远程代码 ...
- TensorFlow.NET机器学习入门【6】采用神经网络处理Fashion-MNIST
"如果一个算法在MNIST上不work,那么它就根本没法用:而如果它在MNIST上work,它在其他数据上也可能不work". -- 马克吐温 上一篇文章我们实现了一个MNIST手 ...