【2018.07.27】(字符串/找相同)学习KMP算法小记
虽然说原理很好理解,但是代码理解了花费我一个下午的时间,脑阔痛
该注释的地方都标记了,希望以后看到这些代码我还能好好理解吧
学习的链接地址:https://www.cnblogs.com/teble/p/7280575.html
/* Number Sequence */
/*Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.
Input
The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
Output
For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
Sample Input
2
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 2 1
Sample Output
6
-1*/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define MAXN 1000050
using namespace std;
//这道题看得出来需要使用到KMP排序
//虽然说我理解了排序原理,却不太懂得实现它
//对于我这种来说,最担心的的莫过于输入问题(所以最后干脆用int数组解决)
int a[MAXN], b[], _next[];
int repeat, i, n;
__int64 m; void makeNext()
{
int q=;//模板b字符串的临时下标,作为比较的后一位
int k=;//最大前后缀长度
_next[]=;//模板字符串第一个字符最大前后缀长度为0
while ( q<n )//遍历数组
{
if ( k== || b[k]==b[q] )//符合条件
{
++k,++q;//同时+1,判断下一位
if ( b[q]!=b[k] ) _next[q]=k;
else _next[q]=_next[k];//上下两句话改变next数组的值
} else k=_next[k];//如果不相等,将前标往前移动
}
/*数据检查for ( k=1 ; k<=n ; k++ )
{
cout<<b[k]<<' ';
}
cout<<endl;
for ( k=1 ; k<=n ; k++ )
{
cout<<_next[k]<<' ';
}
cout<<endl;*/
} int kmp()
{
int i, j;
for ( i=,j= ; i<=m&&j<=n ; )
{
if ( j== || a[i]==b[j] ) ++i,++j;
else j=_next[j];//如果不相等的话,将此时的j变小,相当于将b数组往右移动
//next数组提供,当a[]的后m个元素和b[]开头的前m个元素顺序相同时提供下标的服务
}
if ( j==n+ ) return i-n;//i是当前点,n是b[]的长度,返回的是初始点
else return -;//j==n+1的原因是a[]都被遍历完了,而b[]仍未遍历完
//只有当b[]都被遍历完了才算完整结束
} int main(void)
{
scanf("%d", &repeat);
while ( repeat-- )
{
scanf("%I64d%d",&m ,&n);
for ( i= ; i<=m ; i++ )
{
scanf("%d", &a[i]);
}
for ( i= ; i<=n ; i++ )
{
scanf("%d", &b[i]);
}
makeNext();
cout<<kmp()<<endl;
}
return ;
}
【2018.07.27】(字符串/找相同)学习KMP算法小记的更多相关文章
- 学习KMP算法的一点小心得
KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词:暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个:这样算法复杂度最坏就达到了O(m*n) ...
- 子字符串查找之————关于KMP算法你不知道的事
写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...
- 字符串(2)KMP算法
给你两个字符串a(len[a]=n),b(len[b]=m),问b是否是a的子串,并且统计b在a中的出现次数,如果我们枚举a从什么位置与匹配,并且验证是否匹配,那么时间复杂度O(nm), 而n和m的范 ...
- 学习 KMP 算法
KMP 算法是用来处理字符串匹配问题的.也就是给你两个字符串,你需要回答:B 串是否是 A 串的子串(或 B 串在 A 串中出现的位置).比如,字符串 A = “ i am student ”, 字符 ...
- KMP算法小记
Knuth-Morris-Pratt算法: 转载来自http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_ ...
- 扩展KMP算法小记
参考来自<拓展kmp算法总结>:http://blog.csdn.net/dyx404514/article/details/41831947 扩展KMP解决的问题: 定义母串S和子串T, ...
- 【2018.07.28】(字符串/回文串)学习Manacher算法小记
主要是应用在回文串啦,原理也理解了老半天,如果没有图片的话,我也看不太懂它的原理 学习的灵感来源来自于:https://segmentfault.com/a/1190000008484167 /* 最 ...
- 【2018.07.29】(深度优先搜索/回溯)学习DFS算法小记
参考网站:https://blog.csdn.net/ldx19980108/article/details/76324307 这个网站里有动态图给我们体现BFS和DFS的区别:https://www ...
- 2018.07.17 HAOI2016 找相同字符(SAM)
传送门 就是给两个字符串,让你求公共字串的个数. 本来大佬们都是用的广义后缀自动机,但我感觉后缀自动机已经可以做这道题了.我们对其中一个字串建出后缀自动机,然后用另外一个后缀自动机在上面统计贡献即可. ...
随机推荐
- vue 后台管理系统菜单权限管理
来自:https://www.cnblogs.com/fqh123/p/11094296.html 侵删 login登录方法 login() { if (!this.username) { retur ...
- MIG(ddr3)工程报错解决:IO constraint DQS_BIAS\Multiple Driver Net
现象 在布线自己写的ddr3压力测试代码时,报如下错误. [Constraints 18-586]IO constraint DQS_BIAS with a setting of TRUE for c ...
- linux 安装mysql(rpm文件安装)
三 卸载旧版本的MySql (没有的话,则跳过此步骤) 1.查看旧版本MySql rpm -qa | grep mysql 将会列出旧版本MySql的组件列表,如: ...
- Win10设置开机进入启动设置模块(进入安全模式等)
Win10设置开机进入启动设置模块(进入安全模式等) Win10系统要进入安全模式或其他启动模式选择时,需要在系统中做如下设置后,才可在开机的时候对模式进行选择,操作如下: 1.依次点选:win10设 ...
- python之反射机制与callattr()、issubclass()、isinstance、type()相关
一.反射机制 * 反射可以理解为 通过字符串的形式,动态导入模块: 利用字符串的形式,在对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动! 反射机制的内置函数 # hasa ...
- django(模版)
官方文档:https://docs.djangoproject.com/en/1.11/ref/templates/language/ 常用语法 Django模板中只需要记两种特殊符号: {{ }} ...
- 前端自己导出Excel
1.导出当前页面,这是最简单的,只是导出当前页面的数据. exportData(tableid, name) { let table; let uri = 'data:application/vnd. ...
- java - day017 - 线程
进程 操作系统中, 并行执行的任务 线程 进程内部, 并行执行的任务 进程包含线程 线程的创建 继承Thred 定义 Thred 的子类 重写 run() 方法 在 run() 方法中的代码, 是与其 ...
- syzkaller安装
初始环境配置 sudo apt-get install subversion sudo apt-get install g++ sudo apt-get install git sudo apt in ...
- 一、冒泡排序Bubble sort
https://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html#3824357 #include<iostream> #inclu ...