/*
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. Python3元组的简介和遍历

    一.Python3元组简介 1.1.如何创建一个元组 ''' Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号(),列表使用方括号[]. 元组创建很简单,只需要在括号中添 ...

  2. 「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

    前言 资源是影响 Spark 应用执行效率的一个重要因素.Spark 应用中真正执行 task 的组件是 Executor,可以通过spark.executor.instances 指定 Spark ...

  3. Kerberos认证

    http://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html 最近一段时间都在折腾安全(Security)方面的东西,比如Windows ...

  4. Wireshark(四):网络性能排查之TCP重传与重复ACK

    原文出处: EMC中文支持论坛 作为网络管理员,很多时间必然会耗费在修复慢速服务器和其他终端.但用户感到网络运行缓慢并不意味着就是网络问题. 解决网络性能问题,首先从TCP错误恢复功能(TCP重传与重 ...

  5. 小迪安全 Web安全 基础入门 第七天 - 资产泄漏、CMS识别、Git监控、SVN、DS_Store、备份

    一.CMS指纹识别源码获取方式 1.网站特有文件.如/templets/default/style/dedecms.css-dedecms. 2.网站独有文件的MD5.如favicon.ico但是该文 ...

  6. MySQL 的日志:binlog

    前言:binlog 用于记录数据库执行写入性操作的日志信息,以二进制的形式保留在磁盘中.它是由 Server 层进行记录的,使用任何存储引擎都会产生 binlog. 实验准备 我们通过 Docker ...

  7. CF706A Beru-taxi 题解

    Content 有一个人在点 \((a,b)\) 等出租车.已知他周围共有 \(n\) 辆出租车,其中第 \(i\) 辆车在点 \((x_i,y_i)\) 上,速度为 \(v_i\).这个人想打能让他 ...

  8. Linux 配置与搭建服务

    vsftpd nfs autofs samba firewalld selinux lvm 的试验过程 vsftpd 服务端 yum -y install vsftpd echo 'anon_root ...

  9. SpringBoot整合Apache Shiro

    Subject 用户主体 (把操作交给SecurityManager)SecurityManager 安全管理器 (关联Realm)Realm   Shiro连接数据的桥梁 引入maven依赖 < ...

  10. 【LeetCode】743. Network Delay Time 解题报告(Python)

    [LeetCode]743. Network Delay Time 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...