要先理解前缀函数的定义,前缀函数 \(\pi(i)\) 表示字符串 \(s[0,i]\) 的同时是其最长真前缀及最长真后缀的长度,简单来说就是这个 \(s[0,i]\) 首尾最长的重叠长度(不能完全重叠)。

注意这里的字符串都是从0开始计数的。

int pi[1005];
void GetPrefixFunction(char *s, int sl) {
pi[0] = 0, pi[1] = 0;
for(int i = 1, k = 0; i < sl; ++i) {
while(k && s[i] != s[k])
k = pi[k];
pi[i + 1] = (s[i] == s[k]) ? ++k : 0;
}
} //返回t在s中所有occurrence的首地址,s和t都是从0开始的
int ans[1005], atop;
void KMP(char *s, int sl, char *t, int tl) {
GetPrefixFunction(t, tl);
atop = 0;
for(int i = 0, k = 0; i < sl; ++i) {
while(k && s[i] != t[k])
k = pi[k];
k += (s[i] == t[k]);
if(k == tl)
ans[++atop] = i - tl + 1;
}
}

模板 - 字符串 - KMP算法的更多相关文章

  1. 模板—字符串—KMP(单模式串,单文本串)

    模板—字符串—KMP(单模式串,单文本串) Code: #include <cstdio> #include <cstring> #include <algorithm& ...

  2. 字符串 kmp算法 codeforce 625B 题解(模板)

    题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include < ...

  3. 数据结构(复习)---------字符串-----KMP算法(转载)

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  4. 查找子字符串----KMP算法深入剖析

    假设主串:a b a b c a b c a c b a b      子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...

  5. 字符串KMP算法

    讲解:http://blog.csdn.net/starstar1992/article/details/54913261 #include <bits/stdc++.h> using n ...

  6. 数据结构--KMP算法总结

    数据结构—KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会, ...

  7. KMP算法之我见

    预备谈谈下面这些,可能有补充 KMP算法的用途: KMP算法之前的暴力: KMP算法预备知识与概念: KMP算法模板: KMP算法的习题. 1.KMP算法的用途: 主要用于模式匹配(字符串匹配).给定 ...

  8. KMP算法,匹配字符串模板(返回下标)

    //KMP算法,匹配字符串模板 void getNext(int[] next, String t) { int n = next.length; for (int i = 1, j = 0; i & ...

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

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

随机推荐

  1. 修改CentOS默认yum源为国内镜像

    参考文档 https://blog.csdn.net/inslow/article/details/54177191 国内主要开源的开源镜像站点应该是网易和阿里云了. 修改为163yum源-mirro ...

  2. screen命令下,自启动设置

    建立autostart.sh文件 #!/bin/bash screen_name=$"coffeetest:9100" screen -dmS $screen_name cmd=$ ...

  3. Html form表单大全(一)

    在前后端交互的过程中,除了ajax请求之外,最常见的就是表单请求了. 由于form表单属性多,表单标签内容多且复杂,不深究的话很难全面的弄明白. 接下来就来详细的说一说整个form表单都有些什么,并且 ...

  4. 使用sequelize对数据库进行增删改查

    由于本人对于命令比较执着,所以基本都是在命令下操作的,喜欢使用命令的可以使用Cmder,需要安装.配置的可以参考这篇文章: https://www.cnblogs.com/ziyoublog/p/10 ...

  5. 怎么让自己的本地php网站让别人访问到

    怎么样才能把本地的web网站项目让别人访问到呢?我来给分享一下. 第一:下载jnat工具: 第二:注册一个key; 第三:jnat工具初始化(一键注册本地的Apache+PHP环境): 第四:在jna ...

  6. centOS学习part6:安装oracle 11g

    0 大家好.上一章(http://www.cnblogs.com/souvenir/p/3881484.html)我们对oracle在centOS下的安装进行了各项环境准备,本章我们将正式进行oral ...

  7. 原子性atomic/nonatomic

    原子性:并发编程中确保其操作具备整体性,系统其它部分无法观察到中间步骤,只能看到操作前后的结果. 决定编译器生成的getter和setter是否原子(natomic)操作.   i 因此,atomic ...

  8. MongoDB 3.6.1集群部署

    Mongodb安装 Linux版本:CentOS release 6.9 Mongodb版本:mongodb-linux-x86_64-3.6.1.tgz 示例是在一台主机上安装mongodb集群 端 ...

  9. C# is与 java instanceof 作用相同

    c#中 is 检查对象是否与给定类型兼容. 例如,下面的代码可以确定对象是否为 MyObject 类型的一个实例,或者对象是否为从 MyObject 派生的一个类型: if (obj is MyObj ...

  10. python面试总结2(函数常考题和异常处理)

    python函数常考题 可变类型为参数 不能类型为参数 python如何传递参数 传递值还是引用呢?都不是.唯一支持的参数传递是共享穿参 Call by Object(Call by Object R ...