字符串匹配

Time Limit: 10 Sec  Memory Limit: 256 MB

Description

  

Input

  

Output

  

Sample Input

  3 3
  6 3
  1 2 1 2 3 2
  3 1 3
  6 3
  1 2 1 2 1 2
  3 1 3
  6 3
  1 1 2 1 2 1
  3 1 3

Sample Output

  3
  1 2 4
  4
  1 2 3 4
  3
  2 3 4

HINT

  

Solution

  发现题目中颜色的具体权值是对答案无关的,然后就是只要相对位置一样即可。

  那么显然是一个KMP的模型,变相更改,条件改为:两个字符上一次出现的相对位置相同(也就是位置差值相等)

  那么我们只要求出差值来KMP即可,再考虑一下串长对于答案的影响,差值>串长显然是不会影响答案的,但是直接匹配的话可能将这种情况默认为不可行,所以我们在匹配的时候判断一下串长,若dist>=当前匹配串长则同设为0即可,更新fail的时候也要这么做。这样做KMP即可求出答案。

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std; const int ONE=; int T,C;
int n,m;
int a[ONE],b[ONE];
int da[ONE],db[ONE],la[ONE],lb[ONE];
int fail[ONE],j;
int Ans[ONE],ans_num; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} int Da(int i,int len) {if(da[i]>=len) return ;return da[i];}
int Db(int i,int len) {if(db[i]>=len) return ;return db[i];} int main()
{
T=get(); C=get();
while(T--)
{
n=get(); m=get();
memset(la,,sizeof(la)); memset(lb,,sizeof(lb));
for(int i=;i<=n;i++) a[i]=get();
for(int i=;i<=m;i++) b[i]=get(); for(int i=;i<=n;i++) da[i]=i-la[a[i]], la[a[i]]=i;
for(int i=;i<=m;i++) db[i]=i-lb[b[i]], lb[b[i]]=i; j=;
for(int i=;i<=m;i++)
{
j=fail[i-];
while(j && Db(j+,j+)!=Db(i,j+)) j=fail[j];
if(Db(j+,j+) == Db(i,j+)) j++; else j=;
fail[i] = j;
} j=; ans_num=;
for(int i=;i<=n;i++)
{
while(j && Db(j+,j+)!=Da(i,j+)) j=fail[j];
if(Db(j+,j+) == Da(i,j+)) j++; else j=;
if(j==m) Ans[++ans_num] = i-m+, j=fail[j]; } printf("%d\n",ans_num);
for(int i=;i<=ans_num;i++)
printf("%d ",Ans[i]);
printf("\n");
}
}

【Foreign】字符串匹配 [KMP]的更多相关文章

  1. 字符串匹配KMP算法详解

    1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...

  2. 字符串匹配-KMP

    节选自 https://www.cnblogs.com/zhangtianq/p/5839909.html 字符串匹配 KMP O(m+n) O原来的暴力算法 当不匹配的时候 尽管之前文本串和模式串已 ...

  3. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

  4. 字符串匹配KMP算法

    1. 字符串匹配的KMP算法 2. KMP算法详解 3. 从头到尾彻底理解KMP

  5. 字符串匹配--kmp算法原理整理

    kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...

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

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

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

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

  8. 字符串匹配KMP算法(转自阮一峰)

    转自 http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算 ...

  9. 【Luogu P3375】字符串匹配KMP算法模板

    Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...

随机推荐

  1. c++ combination by next_permutation

    #include <iostream> #include <algorithm> #include <vector> int main() { int n, r; ...

  2. 《数据结构与算法分析:C语言描述》读书笔记

    我们数据结构的课用了这本英文教材,作者是Mark Allen Weiss.总体来说比<算法导论>简单很多,但内容上交集非常大.其实是因为去掉了大多数证明和数学,对于没有耐心看符号和公式的人 ...

  3. jenkins使用Role Strategy管理用户权限

    下载插件地址:https://wiki.jenkins.io/display/JENKINS/Role+Strategy+Plugin 1. 安装好插件后,进入jenkins系统管理的Configur ...

  4. 把python脚本打包成win可执行文件

    前几天有个朋友找我写一点小东西,写好后把代码发他帮他搞了半天,结果愣是没听懂,就找到了这个办法. 1.导入pyinstaller包, pip install pyinstaller 2.进入到你需要打 ...

  5. Python 套接字的使用 (1)

    获取设备名称和IPv4地址 socket.gethostname() socket.gethostbyname(host_name)   def print_machine_info(): host_ ...

  6. day-11 python自带库实现2层简单神经网络算法

    深度神经网络算法,是基于神经网络算法的一种拓展,其层数更深,达到多层,本文以简单神经网络为例,利用梯度下降算法进行反向更新来训练神经网络权重和偏向参数,文章最后,基于Python 库实现了一个简单神经 ...

  7. ios UI自动化测试学习笔记

    一.一些注意事项: 1.做自动化测试时注意如果是真机话首先要设置不锁屏. 2.自动化测试过程中如果程序后台或崩溃了.脚本运行将会暂停,直到程序再次回到前台. 3.必须明确指定关闭自动测试,测试完成或中 ...

  8. UITableView性能优化【本文摘自智车芯官网】

    UITableView是个表格视图,可以在表格行空间中添加多个子控件,UITableView继承了UIScrollView,默认状态下可以堆单元格进行滚动,所有的UITableViewControll ...

  9. Chromium学习笔记

    1. How to build chromium Follow the steps on:http://www.chromium.org/Home 需要安装Win7 x64的OS,PC的配置尽可能高端 ...

  10. Oracle中SQL语言介绍以及基本用法

    一.SQL语言支持如下类别命令 1.数据定义语言(DDL):CREATE(创建).ALTER(更改) 和 DROP(删除)命令 1.1  CREATE (创建表,表空间,用户, 索引, 视图, 同义词 ...