题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711

问题描述:给两个序列a,b,长度分别为n,m(1<=n<=1000000,1<=m<=10000),问序列b是否为序列a的子序列,若:返回a中最左边的与b相等的子序列的首元素下标;若不是,输出-1。

目的:方便以后查看KMP算法中next[]的模板

Number Sequence

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12811    Accepted Submission(s): 5815

Problem Description
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

代码实现:

 1 #include "stdio.h"
 2 #include "string.h"
 3 #define N 10005
 4
 5 int next[N];
 6 int a[100*N],b[N];
 7
 8 void KMP(int *s,int len,int *next) //求next[]模板
 9 {
10     int i,j;
11     i = 0;
12     j = next[0] = -1;
13     while(i<len)
14     {
15         while(j!=-1 && s[i]!=s[j])
16             j = next[j];
17         next[++i] = ++j;
18     }
19 }
20
21 int main()
22 {
23     int T;
24     int i,j;
25     int n,m;
26     scanf("%d",&T);
27     while(T--)
28     {
29         scanf("%d %d",&n,&m);
30         for(i=0; i<n; i++) scanf("%d",&a[i]);
31         for(i=0; i<m; i++) scanf("%d",&b[i]);
32         KMP(b,m,next);
33         i=j=0;
34         while(i<n)
35         {
36             while(j!=-1 && a[i]!=b[j])
37                 j = next[j];
38             i++,j++;
39             if(j==m) break;
40         }
41         if(j==m) printf("%d\n",i-j+1); //题中数据是从下标为1开始的,故加1
42         else printf("-1\n");
43     }
44     return 0;
45 }

转载于:https://www.cnblogs.com/ruo-yu/p/4414062.html

字符串_KMP算法(求next[]模板 hdu 1711)相关推荐

  1. 算法分类整理+模板②:字符串处理

    本周训练赛出了一道kmp模板题,但是由于长时间没有复习字符串处理算法,而且学习时也并没有彻底理解,只是大概明白了思路,所以导致比赛时迟迟没有做出这一题,最后现场拿出学校整理的材料现场重新学习才ac的这 ...

  2. KMP算法 hdu 1711 hdu 2203

    mark一下,重新温习了 KMP KMP复杂度O(n+m) 这里有一个解释的超级的好的博客,大家可以去看一下:http://blog.csdn.net/v_july_v/article/details ...

  3. 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...

    有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误. 把字符串看成 ...

  4. Tarjan 算法思想求强连通分量及求割点模板(超详细图解)

    割点定义 在一个无向图中,如果有一个顶点,删除这个顶点及其相关联的边后,图的连通分量增多,就称该点是割点,该点构成的集合就是割点集合.简单来说就是去掉该点后其所在的连通图不再连通,则该点称为割点. 若 ...

  5. hdu 4160 Dolls 匈牙利算法求最大匹配

    Dolls                                                                               Time Limit: 2000 ...

  6. 线性求逆元模板_ZXBlog/ACM模板(C++).md at bb6f2522054d5370df79222461293721e8edede2 · cw1027/ZXBlog · GitHub...

    ACM模板(C++) 1.大数 加法,乘法模板 //题目链接 : http://poj.org/problem?id=2506 //题目大意 : 就是问你用2*1,1*2,2*2的砖拼成2*n的长方形 ...

  7. 字符串-Manacher算法(你知道马拉车算法吗?)

    文章目录 原理 奇偶问题 p[]数组 马拉车求p[] 模板 例题 P3805 [模板]manacher算法 P1659 拉拉队排练 原理 马拉车算法当然不是马拉着车的奇奇怪怪的东西,是Manacher ...

  8. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  9. CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树

    题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...

  10. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

最新文章

  1. 医疗卫生信息化 医学信息 医疗信息化 医院管理 资料下载
  2. netty 对 protobuf 协议的解码与包装探究(2)
  3. union--求集合的并集
  4. Android API Level对应Android版本一览表
  5. JEPaas代码_((列表)输入字段值而计算
  6. 如何在README中使用图片
  7. 兔子--百度地图所需的jar+so下载地址
  8. Oracle11 startup报错,oracle11g 启动报错 缺少系统参数
  9. python数据如何保存到excel中
  10. SHLVL 和 BASH_SUBSHELL 两个变量的区别
  11. python获取cpu信息_使用python获取CPU和内存信息的思路与实现(linux系统)
  12. Transact-SQL 语法约定
  13. 服务器位置设置,服务器部署位置
  14. SQL语句学习1——SHOW命令
  15. vb读取mysql数据库数据_VB读取ORACLE数据库的两种方法
  16. PS 模糊图片背景(滤镜)
  17. 10种常用数据分析方法
  18. windows下桌面便签小工具简单使用技巧
  19. win10桌面背景为什么突然变黑了 win10桌面背景不显示解决方法
  20. 用Python实现TXT文件分割

热门文章

  1. 从实例入手,讲解 CMake 的常见用法。demo1-demo8
  2. 硬,软连接,以及在windows中的用法
  3. 数据结构与算法LeetCode题目索引
  4. Django 06模板语言的复用
  5. 《Netty权威指南》(二)NIO 入门
  6. 必看谈谈数据库的锁机制!!
  7. [转]win7添加xp的快速启动栏
  8. [转]网友monkeylarry研究生期间我们应该做什么
  9. go语言之进阶篇字符串转换
  10. LE SHAN GIANT BUDDHA and LINGYUN TEMPLE