1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<stdlib.h>
  5. #include<vector>
  6. #include<queue>
  7. #include<stack>
  8. #include<iostream>
  9. #include<string>
  10. #include<algorithm>
  11. using namespace std;
  12.  
  13. #define MaxSize 1000005
  14. #define inf 0x3f3f3f3f
  15. #define LL long long int
  16.  
  17. int n,m;
  18. int ori[MaxSize],tar[MaxSize],NEXT[MaxSize];//有点醉,本来写的next和algorithm库里面的东西重名CE了。所以用不着的头文件别乱写。
  19.  
  20. void get_NEXT()
  21. {
  22. int i=;//i是指在目标串中走到了i位
  23. int j=NEXT[]=-;//把这里设置成-1,而不是0,是非常巧妙的。j一直都是NEXT[i]
  24.  
  25. while(i<m)//得到目标串的NEXT,注意范围
  26. {
  27. if(j==- || tar[j]==tar[i])//j==-1有两种情况,第一个是刚开始从第0位开始的时候,第二个是后面找不到相同的前缀后一位的时候
  28. NEXT[++i] = ++j;
  29.  
  30. else
  31. j=NEXT[j];
  32.  
  33. /*如果一直这样代换下去,走到j=0的时候,然后进行下一次循环:j==-1不满足,
  34. 于是就比较tar[0]和tar[i],就是a.....|b的第一位a和现在在i位上的b比较。
  35. 如果j==0的时候tar[0]==tar[i]还不满足,说明前面所有的前缀的之后一位都没有和当前i位一样的。
  36. 那就应该有NEXT[++i]=0。在代码中,如果j==0的时候tar[0]==tar[i]还不满足,j就会走到-1,
  37. (因为我们设置的NEXT[0]=-1)。于是下一步循环的时候,++j就就恰是0,于是NEXT[++i]=0,就是巧妙在这里*/
  38. }
  39. }
  40.  
  41. int match()
  42. {
  43. int i=;//i是指在原始串中走到了i位置
  44. int j=;//j是指在目标串中走到了j位置
  45.  
  46. while(i<n)//在原始串中从头到尾匹配,如果走到最后,过程中都没有return,说明没有找到匹配。最后while结束后就返回-1
  47. {
  48. if(j==- || ori[i]==tar[j])//一位一位匹配下去
  49. {
  50. i ++;
  51. j ++;
  52. }
  53.  
  54. else//走到某一位的时候发现不能匹配,那么就移位。移位之后,j就跑到前缀的后一位,然后继续往后匹配。当然此时的i是不应该变的。
  55. j=NEXT[j];
  56. /*如果j代换到了j==0,(原始串:....a.....,目标串b.....)那么就是用当前原始串的第i位a比较目标串第一位b
  57. 如果还不能匹配,那么j就代换成-1,,原始串的i就到下一位,目标串的j本来是-1,加1之后就变成0,也就是又从第一位开始比较
  58. 巧妙的=NEXT[0]=-1。*/
  59.  
  60. if (j == m) return i-m+;//匹配完了,j就会走到目标串的最后一位(即m-1位)之后,j++就变成了m,这里就应该return了。
  61. }
  62.  
  63. return -;
  64. }
  65.  
  66. int main()
  67. {
  68. int T;
  69. scanf("%d",&T);
  70.  
  71. while(T--)
  72. {
  73. scanf("%d%d",&n,&m);
  74.  
  75. for(int i=; i<n; i++)
  76. scanf("%d",&ori[i]);
  77.  
  78. for(int i=; i<m; i++)
  79. scanf("%d",&tar[i]);
  80.  
  81. get_NEXT();
  82. /*for(int i=0;i<m;i++)
  83. printf("%d ",NEXT[i]);printf("\n");*/
  84. printf("%d\n",match());
  85. }
  86.  
  87. return ;
  88. }

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. 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接

    最近的一个项目碰到这种问题,摸索出了解决办法,故此记录下 example 如果控制器为 ShopCollect 方法为 UserList solution 请求的链接应该为 doman.com/sho ...

  2. 【Hadoop/Hive/mapreduce】系列之如何删除HIVE 表格的分区

    今天的一个业务场景就是要把三年的数据从第一天不停的融合起来,每一天作为表格一个新的分区.由于空间有限,数据量很大,可能每天数据都是几十个G的大小.所以我需要做的一点就是在融合这一天之后,删除一天的分区 ...

  3. python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息

    1.问题描述: 爬取链家深圳二手房的详细信息,并将爬取的数据存储到Excel表 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目标网址:https://sz.lianjia.com ...

  4. Makefile (2) gdb

    gdb调试 1.用debug的方式编译 -g 2.打上断点 3.单步调试 step into 进入函数里面 step over 运行整个函数 step return 跳出当前函数 4.继续运行 5.打 ...

  5. Educational Codeforces Round 43 E. Well played!(贪心)

    E. Well played! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  6. C语言进阶——分支语句06

    if分支语句分析: if语句用于根据条件选择执行语句 else不能独立存在且总是与在它之前的最近if相匹配 esle语句后可以连接其他if语句 用法如下: if(condition) { //stat ...

  7. MVC WebAPI 的基本使用

    1.什么是WebAPI Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务.消息服务.计算服务等能力,利用这些能力可以进行开发出强大功能的web应用. 它可以 ...

  8. laravel5.5契约

    无规矩不成方圆, Laravel 的契约是一组定义框架提供的核心服务的接口,规定了实现该接口的规范. 为什么要使用接口 首先,让我们来看一些高耦合缓存实现的代码.如下: <?php namesp ...

  9. DNSSec

    Domain Name System Security Extensions (DNSSEC)DNS安全扩展,是由IETF提供的一系列DNS安全认证的机制(可参考RFC2535).它提供了一种来源鉴定 ...

  10. 如何使用malloc申请一个二位数组

    fscanf(file, "%d", &iVertexNum); // Read number of Vertices double **G = (double **)ma ...