首页 > 其他分享 >(KMP 1.1)hdu 1711 Number Sequence(KMP的简单应用——求pattern在text中第一次出现的位置)

(KMP 1.1)hdu 1711 Number Sequence(KMP的简单应用——求pattern在text中第一次出现的位置)

时间:2023-04-11 14:31:38浏览次数:55  
标签:hdu 1.1 int pattern next ++ text KMP nnext


题目:


Number Sequence

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


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

 


Source

HDU 2007-Spring Programming Contest

 


Recommend

lcy   |   We have carefully selected several similar problems for you:   1358  3336  1686  3746  2222 



题目分析:

               KMP。简单题。



代码如下:



#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;

const int maxn = 1000001;

int n;//文本串的长度
int m;//目标串的长度

int text[maxn];//文本串
int pattern[maxn];//模式串
int nnext[maxn];//next数组.直接起next可能会跟系统中预定的重名

/*O(m)的时间求next数组*/
void get_next() {
	nnext[0] = nnext[1] = 0;
	for (int i = 1; i < m; i++) {
		int j = nnext[i];
		while (j && pattern[i] != pattern[j])
			j = nnext[j];
		nnext[i + 1] = pattern[i] == pattern[j] ? j + 1 : 0;
	}
}

/*o(n)的时间进行匹配
 *
 * 返回第一次匹配的位置
 */
int kmp() {
	int j = 0;/*初始化在模式串的第一个位置*/
	for (int i = 0; i < n; i++) {/*遍历整个文本串*/
		while (j && pattern[j] != text[i])/*顺着失配边走,直到可以匹配,最坏得到情况是j = 0*/
			j = nnext[j];
		if (pattern[j] == text[i])/*如果匹配成功继续下一个位置*/
			j++;
		if (j == m) {/*如果找到了直接输出*/
//         printf("%d\n" , i-m+2);/*输出在文本串中第一个匹配的位置,不是下标*/
			return i - m + 2;//返回的位置从1开始算
		}
	}
//    printf("-1\n");

	return -1; //表示没有找到匹配的位置
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &n, &m);
		int i;
		for (i = 0; i < n; ++i) {
			scanf("%d", &text[i]);
		}

		for (i = 0; i < m; ++i) {
			scanf("%d", &pattern[i]);
		}

		get_next();
		printf("%d\n", kmp());
	}

	return 0;
}






标签:hdu,1.1,int,pattern,next,++,text,KMP,nnext
From: https://blog.51cto.com/u_5290007/6183276

相关文章

  • 墨干编辑器 V1.1.2:提供 macOS arm 和 Ubuntu 安装包
    墨干编辑器V1.1.2:提供macOSarm和Ubuntu安装包来源:投稿作者: 沈浪熊猫儿2023-04-1011:22:00 0马上下载 :https://mogan.app/guide/Install.html重要变更社区:官网上线 https://mogan.app ,参加由中科院软件所举办的开源之夏2023界面:图标由GNUTeX......
  • KMP算法(串的模式匹配算法)(未完待续......)
    KMP算法的实现1.基本原理  在暴力破解算法(BF算法)中,模式串需要一个一个来跟主串进行对比,若有一个不相同,则主串前进一位,继续从头开始进行比较,这样比较的最坏时间复杂度为O(mn),例:‘aaaaaaaaab’和‘aaab’,需要比较到最后一个才能成功,效率太过低下。  KMP算法的原理是,找到模式串......
  • hdu-4533(线段树+区间合并)
    约会安排HDU-4553跟hdu-1540(线段树+区间合并)-魏老6-博客园(cnblogs.com)是一样,但是要写两个线段树。线段树维护,最长前缀pre,最长后缀suf,以及最大连续连续区间sum。1代表空,0代表时间被占了还有几个注意事项:当是DS时,只能查询和修改屌丝树;当是NS时,先判断屌丝树能不......
  • 巧如范金,精比琢玉,一分钟高效打造精美详实的Go语言技术简历(Golang1.18)
    转自刘悦研发少闲月,九月人倍忙。又到了一年一度的“金九银十”秋招季,又到了写简历的时节,如果你还在用传统的Word文档寻找模板,然后默默耕耘,显然就有些落后于时代了,本次我们尝试使用云平台flowcv高效打造一份巧如范金、精比琢玉的高品质Golang技术简历。首先来到云平台:flowcv.com......
  • KMP 字符串
    KMP题目描述给定一个字符串\(S\),以及一个模式串\(P\),所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串\(P\)在字符串\(S\)中多次作为子串出现。求出模式串\(P\)在字符串\(S\)中所有出现的位置的起始下标。输入第一行输入整数\(N\),表示字符串\(P\)的长度......
  • hdu-1540(线段树+区间合并)
    TunnelWarfareHDU-1540思路:没被摧毁的村庄为1,否则为0,用len记录线段树维护区间的两个信息:前缀最长1的序列pre后缀最长1的序列suf父节点与左右子节点的关系://lc为左节点,rc为右节点1.若左右结点都不满1,则tr[p].pre=tr[lc].pre,tr[p].suf=tr[rc].suf2.若左节点满1,tr......
  • docker-compose 部署 consul v1.15.2
    server1配置文件{"node_name":"consul-server1","datacenter":"zhongtai","domain":"consul","server":true,"log_level":"INFO","ui_conf......
  • HDU - 3572 Task Schedule (最大流)
    题目大意:有N个任务,M台机器。每个任务有相应的起始时间,截至时间和完成时间每台机器一小时可以做1个单位的工作量,每个任务的完成可以不连续,但每次只能由一台机器完成问能否完成所有任务解题思路:因为只有500分钟,所以可以将每分钟都设成1条边,连向超级汇点,容量为M每个任务连接向......
  • HDU - 3338 Kakuro Extension(最大流 行列模型)
    题目大意:看一下图基本就知道了解题思路:难点是构图。。设置一个超级源点和所有的行的和相连,容量为该行的和-该行和由几个数相加得到,因为这里将0看成了,1看成了2,依此类推设置一个超级汇点,和所有列的和相连,容量为该列的和-该列和由几个数相加得到,和上面一样接着就是空白部分......
  • HDU - 3081 Marriage Match II(二分图最大匹配 + 并查集)
    题目大意:有n个男生n个女生,现在要求将所有的男女配对,所有的男女都配对的话,算该轮游戏结束了。接着另一轮游戏开始,还是男女配对,但是配对的男女不能是之前配对过的。问这游戏能玩多少轮男女能配对的条件如下1.男女未曾吵架过。2.如果两个女的是朋友,那么另一个女的男朋友可以和......