HDU - 1711 A - Number Sequence(kmp
InputThe 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].
OutputFor 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
题目是说给a和b数组,求b数组是否为a的连续子数组并且输出匹配的最小位置,如果找不到的话输出-1
直接暴力会超时吧(或许,读清题意后会知道这就是kmp的裸题
一开始因为用的cin交的g++超时了,然后改成scanf和c++标准过了
没啥坑,入门题,拉的满为姐姐的板子,手动模拟了一下next数组,知道了维护的东西大概明白思路了,就过了嘿嘿
然后说一下暴力做法和kmp做法,如果这道题用暴力写,也就是b数组和a数组逐个匹配,最差情况下是每次都比较到最后一个字符发现不对,知道比到最后,复杂度是O(m*n)
你已经是个成熟的acmer了,不能什么题都暴力模拟了。
kmp的写法是对数组b维护一个next数组,拿第一个样例来说,b数组是1 2 3 1 3,当匹配完第四个字符之后发现第五个不一致,但是这个时候又从头匹配的话有些浪费,然后我们发现第一个字符和第四个字符是一样的,所以可以直接跳到原第四个字符对应的位置后进行比较
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3 没有next数组时候,下一步的操作是
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3
有的话是
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3
#include<stdio.h>
///kmp算法是在线性时间内利用next数组找到tt字符串中是否出现过tt字符串
///时间复杂度O(s+t)
const int N = 1e7+;
const int M = 1e4+;
int nt[N],a[N],b[M],m,n;
int kmp(int *ss,int *tt)///要匹配的是ss
{
int s=n;
int t=m;
if(s>t)return ;
nt[]=-;
int num=;
for(int i=,j=-;i<s;){
if(j==-||ss[i]==ss[j]){
i++;j++;nt[i]=j;
}
else j=nt[j];
}//next数组
for(int i=,j=;i<t;){
if(j==-||ss[j]==tt[i]){
i++;j++;
}
else j=nt[j];
if(j==s){//该处表示在tt字符串中找到了ss字符串(当然你也可以在这个地方记录其他信息,我的是找到就返回1)
return i+-n;
}
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&m,&n);
for(int i = ;i < m;++i)scanf("%d",&a[i]);
for(int i = ;i < n;++i)scanf("%d",&b[i]);
int ans = kmp(b,a);
if(ans)printf("%d\n",ans);
else puts("-1");
}
}
HDU - 1711 A - Number Sequence(kmp的更多相关文章
- HDU 1711:Number Sequence(KMP)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 1711:Number Sequence(KMP模板,求位置)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 1711 Number Sequence(KMP)附带KMP的详解
题目代号:HDU 1711 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/ ...
- HDU 1711 Number Sequence (KMP简单题)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 1711 Number Sequence(kmp)
Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...
- HDU 1711 Number Sequence(KMP模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1711 这道题就是一个KMP模板. #include<iostream> #include<cs ...
- 1711 Number Sequence(kmp)
Number Sequence Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) To ...
- Number Sequence(kmp)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU1711 Number Sequence(KMP模板题)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- FTP服务器安装配置
1.安装:yum install vsftpd -y 2.修改配置文件:cd /etc/vsftpd/ cat vsftpd.conf | grep -Ev '^$|^#' listen_port= ...
- np.max() 和 np.maximum()的区别
1.np.max(a, axis=None, out=None, keepdims=False) 求序列的最值 最少接受一个参数 axis默认为axis=0即列向,如果axis=1即横向 ex: &g ...
- LightGBM GPU python版本安装
失败的安装尝试 1.官方Guide https://lightgbm.readthedocs.io/en/latest/GPU-Windows.html 生成在windows下可执行的exe程序,但是 ...
- leetcode题目10.正则表达式匹配(困难)
题目描述: 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 ...
- hdu 1166 线段树 奇兵布阵
#include<iostream> using namespace std; ; )*];//n个叶子就有2*n-4*n个节点 ]; int n; void getup(int root ...
- laravel insert 、save、update、create区别(总结二)
1.insert:插入数据时,需要维护 created_at 和 updated_at字段, 2.save:无论插入或者更新,会自动维护,无需手动操作 //插入: public function st ...
- koa 基础(九) ejs 模板引擎的使用
1.app.js /** * ejs 模板引擎的使用: * 1.npm install koa-views --save * 2.npm install ejs --save * 3.var view ...
- java html table 转 excel,给予jdom 和 poi
maven 引入 <dependency> <groupId>org.jdom</groupId> <artifactId>jdom</artif ...
- LoadRunner 技巧之 思考时间设置
LoadRunner 技巧之 思考时间设置 用户访问某个网站或软件,一般不会不停地做个各种操作,例如一次查询,用户需要时间查看查询的结果是否是自己想要的.例如一次订单提交,用户需要时间核对自己填写的信 ...
- java最常见的5个错误
1. Null 的过度使用 避免过度使用 null 值是一个最佳实践.例如,更好的做法是让方法返回空的 array 或者 collection 而不是 null 值,因为这样可以防止程序抛出 Null ...