/*
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算法解题模板(更新)的更多相关文章

  1. KMP算法(——模板习题与总结)

    KMP算法是一种改进的模式匹配算法,相比于朴素的模式匹配算法效率更高.下面讲解KMP算法的基本思想与实现. 先来看一下朴素模式匹配算法的基本思想与实现. 朴素模式匹配算法的基本思想是匹配过程中如果该位 ...

  2. KMP算法(模板)

    话说kmp真的挺难理解的,花了挺大功夫的,恩,找了段好理解的代码,做模板了 int KMP(char *s,char *p){ int ans = -1; nex[0] = 0; int lenp = ...

  3. KMP算法_模板_C++

    这个博客讲得非常优秀,可惜它是Java版本的 http://blog.csdn.net/yutianzuijin/article/details/11954939/ a 为匹配串,b 为目标串 通俗讲 ...

  4. 【kmp算法】模板

    void GetFail(char P[],int __next[])//__next[i]表示s[0]~s[i-1]的前缀中,最大长度相等的前后缀是多少 { __next[0]=-1; int le ...

  5. 信息竞赛进阶指南--KMP算法(模板)

    next[1] = 0; for (int i = 2, j = 0; i <= n; i++) { while (j > 0 && a[i] != a[j+1]) j = ...

  6. 串的模式之kmp算法实践题

    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...

  7. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  8. [模板]KMP算法

    昨天晚上一直在调KMP(模板传送门),因为先学了hash[关于hash的内容会在随后进行更(gu)新(gu)]于是想从1开始读...结果写出来之后一直死循环,最后我还是改回从0读入字符串了. [预先定 ...

  9. KMP算法模板&&扩展

    很不错的学习链接:https://blog.csdn.net/v_july_v/article/details/7041827 具体思路就看上面的链接就行了,这里只放几个常用的模板 问题描述: 给出字 ...

随机推荐

  1. mysql联合索引阻碍修改列数据类型:BLOB/TEXT column 'name' used in key specification without a key length

    今天在项目中mysql表中有一个字段数据类型为varchar,长度不够需要换为text类型 当时表是已经存在的表, CREATE TABLE `table_aaa` ( `id` int NOT NU ...

  2. 小迪安全 Web安全 基础入门 - 第四天 - 30余种加密编码进制&Web&数据库&系统&代码&参数值

    一.密码存储加密 1.MD5值是32或16位由数字"0-9"和字母"a-f"所组成的字符串 2.SHA1加密的密文特征与MD5类似,但位数是40位 3.NTLM ...

  3. Java Record 的一些思考 - 默认方法使用以及基于预编译生成相关字节码的底层实现

    快速上手 Record 类 我们先举一个简单例子,声明一个用户 Record. public record User(long id, String name, int age) {} 这样编写代码之 ...

  4. python获取命令行传参的两种种常用方法argparse解析getopt 模块解析

    方法一:argparse解析 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 2020/5/20 10:38 # @Author:zhan ...

  5. response 返回js的alert()语句,中文乱码如何解决

    response 返回js的alert()语句,中文乱码如何解决, 步骤1:在后台加上如下代码: response.setCharacterEncoding("utf-8"); r ...

  6. 在myeclipse里加大tomcat内存,jdk内存方法

    这是在myeclipse里加大的方法: -Xms4096m -Xmx4096m -XX:MaxNewSize=4096m -XX:MaxPermSize=4096m 如图所示: -XX:PermSiz ...

  7. Miniconda入门教程

    Miniconda 教程 介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.因为包含了大量的科学包,Anaconda 的下载文件 ...

  8. 平衡二叉树判定方法(c++)实现

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist -- 欢迎指正-- 平衡二叉树特点: 任意一个结点的平衡因子(左子树高度 - 右子树高度)的 ...

  9. Windows串口之解决包含setupapi.h还提示找不到符号报错

    关于 本文演示环境: win10 1909 + VS2017 1. 错误信息 明明已经添加了头文件setupapi.h 和 库 setupapi.lib, 却还是提示报错,报错信息: 1>C:\ ...

  10. 【LeetCode】295. Find Median from Data Stream 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 大根堆+小根堆 日期 题目地址:https://le ...