#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<stack>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std; #define MaxSize 1000005
#define inf 0x3f3f3f3f
#define LL long long int int n,m;
int ori[MaxSize],tar[MaxSize],NEXT[MaxSize];//有点醉,本来写的next和algorithm库里面的东西重名CE了。所以用不着的头文件别乱写。 void get_NEXT()
{
int i=;//i是指在目标串中走到了i位
int j=NEXT[]=-;//把这里设置成-1,而不是0,是非常巧妙的。j一直都是NEXT[i] while(i<m)//得到目标串的NEXT,注意范围
{
if(j==- || tar[j]==tar[i])//j==-1有两种情况,第一个是刚开始从第0位开始的时候,第二个是后面找不到相同的前缀后一位的时候
NEXT[++i] = ++j; else
j=NEXT[j]; /*如果一直这样代换下去,走到j=0的时候,然后进行下一次循环:j==-1不满足,
于是就比较tar[0]和tar[i],就是a.....|b的第一位a和现在在i位上的b比较。
如果j==0的时候tar[0]==tar[i]还不满足,说明前面所有的前缀的之后一位都没有和当前i位一样的。
那就应该有NEXT[++i]=0。在代码中,如果j==0的时候tar[0]==tar[i]还不满足,j就会走到-1,
(因为我们设置的NEXT[0]=-1)。于是下一步循环的时候,++j就就恰是0,于是NEXT[++i]=0,就是巧妙在这里*/
}
} int match()
{
int i=;//i是指在原始串中走到了i位置
int j=;//j是指在目标串中走到了j位置 while(i<n)//在原始串中从头到尾匹配,如果走到最后,过程中都没有return,说明没有找到匹配。最后while结束后就返回-1
{
if(j==- || ori[i]==tar[j])//一位一位匹配下去
{
i ++;
j ++;
} else//走到某一位的时候发现不能匹配,那么就移位。移位之后,j就跑到前缀的后一位,然后继续往后匹配。当然此时的i是不应该变的。
j=NEXT[j];
/*如果j代换到了j==0,(原始串:....a.....,目标串b.....)那么就是用当前原始串的第i位a比较目标串第一位b
如果还不能匹配,那么j就代换成-1,,原始串的i就到下一位,目标串的j本来是-1,加1之后就变成0,也就是又从第一位开始比较
巧妙的=NEXT[0]=-1。*/ if (j == m) return i-m+;//匹配完了,j就会走到目标串的最后一位(即m-1位)之后,j++就变成了m,这里就应该return了。
} return -;
} int main()
{
int T;
scanf("%d",&T); while(T--)
{
scanf("%d%d",&n,&m); for(int i=; i<n; i++)
scanf("%d",&ori[i]); for(int i=; i<m; i++)
scanf("%d",&tar[i]); get_NEXT();
/*for(int i=0;i<m;i++)
printf("%d ",NEXT[i]);printf("\n");*/
printf("%d\n",match());
} return ;
}

HDU 1711 Number Sequence---KMP原始的更多相关文章

  1. HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. hdu 1711 Number Sequence KMP 基础题

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. HDU 1711 Number Sequence (KMP 入门)

    Number Sequence Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and ...

  4. HDU 1711 - Number Sequence - [KMP模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  5. HDU 1711 Number Sequence KMP

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1711 AC代码: #include <iostream> #include <cs ...

  6. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  7. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  8. HDU 1711 Number Sequence 【KMP应用 求成功匹配子串的最小下标】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/O ...

  9. HDU 1711 Number Sequence(KMP)附带KMP的详解

    题目代号:HDU 1711 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/ ...

  10. HDU 1711 Number Sequence (KMP简单题)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. Fiddler(一)

    Fiddler:学习scrapy,不只是满足于网页上爬去信息的成功乐趣,现在开始接触爬去手机信息了,不好解决,知道过程不会轻松,但自己想去尝试.QAQ 写这篇博客是基于以下的几位大神学习笔记,我只是做 ...

  2. Hive的数据库和表

    本文介绍一下Hive中的数据库(Database/Schema)和表(Table)的基础知识,由于篇幅原因,这里只是一些常用的.基础的. Hive的数据库和表 先看一张草图: Hive结构 从图上可以 ...

  3. Python全栈day 01

    Python全栈day 01 一.计算机认识 用户 软件,类似微信.QQ.游戏等应用程序,由程序员编写,在系统中运行,完成各种活动,方便人们使用. 操作系统,主要分为windows系统.Linux系统 ...

  4. 011---Djang的cookie和session

    -------------------------------------------------------------cookie与session------------------------- ...

  5. 小白日记1:kali环境Wpscan渗透Wordpress

    一.什么是Wpscan?什么是Wordpres? 1.Wpscan WPScan是一款针对wordpress的安全扫描软件:可以扫描出wordpress的版本,主题,插件,后台用户以及爆破后台用户密码 ...

  6. 8,实例化Flask的参数 及 对app的配置

    Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...

  7. Redis数据更新

    技术交流群: 233513714

  8. selenium IDE录制脚本和自定义脚本-->Katalon Recorder(二)

    selenium IDE提供了两种生成脚本的方式:录制脚本和自定义脚本 录制脚本:1.打开firefox空白标签,在标签上输入需要录制脚本的网址:2.打开selenium IDE界面中的录制按钮(圆形 ...

  9. 解决display:inline-block;行内块元素出现空白空隙问题

     给他的父元素加:font-size:0px;,   ul { font-size:0px;} li { font-size:16px;}

  10. python 学习分享-进程

    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包multiprocessing,只需要定 ...