文章目录

  • 题目描述
  • 解析
  • 代码

题目描述


解析

看了题解。。。
这题的关键在于可以变换匹配的一个充要条件:
每个字符与前一个相同字符的距离相同
这个搞出来之后就可以以它为关键字进行KMP了
注意!
与前一个字符的距离超过匹配长度时,是没有意义的,应该当做首次出现处理!

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
typedef unsigned long long ull;
const int N = 1e6+100;
const int M=1e7+5;
const int mod=1e9+7;
int n,m;
int t,c;
int a[N],b[N],st[N],ans;
int last[N],prea[N],preb[N];
int p[N];
int ask(int x,int y){return x<y?x:0;}
void solve(){p[1]=0;for(int i=1,j=0;i<m;i++){while(j&&ask(preb[i+1],j+1)!=ask(preb[j+1],j+1)) j=p[j];if(ask(preb[i+1],j+1)==ask(preb[j+1],j+1)) j++;p[i+1]=j;//printf("i=%d p=%d\n",i+1,j);}
}
void find(){ans=0;for(int i=0,j=0;i<n;i++){while(j&&ask(prea[i+1],j+1)!=ask(preb[j+1],j+1)) j=p[j];if(ask(prea[i+1],j+1)==ask(preb[j+1],j+1)) j++;//printf("i=%d j=%d\n",i+1,j);if(j==m){st[++ans]=i+1-m+1;j=p[j];}}
}
int main(){scanf("%d%d",&t,&c);while(t--){scanf("%d%d",&n,&m);memset(last,0,sizeof(last));for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=m;i++) scanf("%d",&b[i]);for(int i=1;i<=n;i++){prea[i]=ask(i-last[a[i]],m);last[a[i]]=i;//printf("i=%d pre=%d\n",i,prea[i]);}memset(last,0,sizeof(last));for(int i=1;i<=m;i++){preb[i]=ask(i-last[b[i]],m);last[b[i]]=i;}solve();find();printf("%d\n",ans);for(int i=1;i<=ans;i++) printf("%d ",st[i]);printf("\n");}return 0;
}

YBTOJ:字符串匹配(KMP)相关推荐

  1. 字符串匹配KMP算法

    字符串匹配KMP KMP过程其实就是去找下一个更好的状态的过程,省略去了中间穷举的无用过程,直接跳到下一个更好的状态,通过模式串本身的信息,站在模式串的角度来考虑问题 取长的一对 若想让模式串直接从S ...

  2. kmp算法详解php,php中字符串匹配KMP算法实现例子

    KMP算法是一个比较高级的算法了,加了改进了,下面我们来在php中实现KMP算法,希望例子对各位同学会带来帮助哦. kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J. ...

  3. C++实现字符串匹配KMP算法

    文章目录 1. 概述 2. 代码实现 3. 代码测试 1. 概述 Kmp算法的介绍及思想参阅下面两篇文章: 字符串匹配KMP算法 算法)通俗易懂的字符串匹配KMP算法及求next值算法 2. 代码实现 ...

  4. 字符串匹配 KMP算法

    问题描述:字符串匹配即查找待匹配字符串(模式串)p在主串s中的位置.一般处理这种问题往往采用简单粗暴的方法--暴力匹配法.所谓暴力匹配法,就是对主串s的每一个字符与要匹配的字符串p的每个字符进行逐一匹 ...

  5. 字符串匹配——KMP算法

    字符串匹配--KMP算法 ​ 字符串匹配是计算机编程中最常使用到的基础算法之一.字符串匹配相关的算法很多,Knuth-Morris-Pratt(KMP)算法是最常用的之一.最近在学习KMP算法,学习了 ...

  6. 字符串匹配のKMP【专题@AbandonZHANG】

    算法详解 很长时间内都没有能够很理解KMP算法的精髓,尤其是很多书上包括<算法导论>没有把next函数(亦或 π函数)讲解的很透彻. 今天去看了matrix67大牛博客中关于kmp部分的讲 ...

  7. C语言实现字符串匹配KMP算法

    相信很多人(包括自己)初识KMP算法的时候始终是丈二和尚摸不着头脑,要么完全不知所云,要么看不懂书上的解释,要么自己觉得好像心里了解KMP算法的意思,却说不出个究竟,所谓知其然不知其所以然是也. 字符 ...

  8. [JAVA][算法] [字符串匹配]KMP

    我们为什么需要KMP? 在字符串匹配问题中,我们需要找到匹配串pattern在原串text中的位置,一种显而易见的思路就是暴力匹配,如图所示,我们把pattern放置到text中的每个位置进行比较即可 ...

  9. 字符串匹配KMP算法的讲解C++

    转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...

  10. 字符串匹配のKMP【@Abandon】

    算法详解 很长时间内都没有能够很理解KMP算法的精髓,尤其是很多书上包括<算法导论>没有把next函数(亦或 π函数)讲解的很透彻. 今天去看了matrix67大牛博客中关于kmp部分的讲 ...

最新文章

  1. cmyk图像处理matlab,数字图像处理及MATLAB实现 全套课件.pptx
  2. jenkins linux虚拟机,Linux系统中jenkins使用的简单介绍
  3. linux哪个命令可以切换工作目录?如何显示当前所在的目录,Linux cd命令:切换目录...
  4. 《MySQL——数据表设计三大范式》
  5. 数据链路层:基本概念
  6. POJ1207-The 3n + 1 problem
  7. C++与C中const的比较以及const和define的比较
  8. springboot2整合mysql5_SpringBoot2整合SSM框架详解
  9. python 移除列表中的值 list index out of range_重拾Python(二)之列表
  10. Input标签牲描述
  11. XE4 TStringDynArray 比 c6 的TStringList 好用 字符串 分解 分割 转换 TByteDynArray
  12. 计算机网络课程设计 学校园网设计
  13. HTML+CSS系列教程导学
  14. java 打印 线程_java线程状态和获取线程基本信息
  15. 【游戏设计】3D坦克大战
  16. 国外android 邮件工具,对比测评国内外四个邮箱APP 邮箱大师表现最全能
  17. VS1005 HiRes 高清播放器方案
  18. CSS中font-family属性值中文和英文的问题
  19. 软件新产品开发失败原因分析
  20. 8086CPU汇编环境安装

热门文章

  1. 1个月教你学会用Python实现机器学习
  2. java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序
  3. mysql 卸载插件_MySQL 插件安装或卸载(window validate_password 为例)
  4. linux脚本 逻辑运算,Linux-shell-逻辑运算和;
  5. linux监听端口丢失,linux – 如果没有监听端口,则为Systemd重启服务
  6. hive 导入mysql数据库_求助 Hive 导入MYsql 数据库 报错啊
  7. jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项
  8. java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...
  9. leetcode——242. 有效的字母异位词
  10. JVM笔记(JVM内存+垃圾回收器)详解