hdu 1711
来源:互联网 发布:cassandra 数据库设计 编辑:程序博客网 时间:2024/05/29 23:47
KMP入门题
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
很久以前就接触了KMP,但那时还没有做题,差不多都忘了.....
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
213 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 1 313 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 2 1
Sample Output
6 -1
KMP是一个字符串的匹配算法,前面转载的那编文章说的很详细.
AC code:
#include<iostream>#include<stdio.h>using namespace std;int a[1000005],b[10005];int nextval[10005];void get_next(int b[],int m){int i=0;nextval[0]=-1;int j=-1;while(i<m){ if(j==-1||b[i]==b[j]) {++i;++j; if(b[i]==b[j]) nextval[i]=nextval[j]; else nextval[i]=j;}elsej=nextval[j]; }}int KMP(int a[],int n,int b[],int m,int nextval[],int pos){int i=pos;int j=0;while(i<n&&j<m){if(j==-1||a[i]==b[j]){++i;++j;}elsej=nextval[j]; } if(j>=m) return i-j+1; else return -1;}int main(){int test,n,m,i,j;scanf("%d",&test);while(test--){ scanf("%d%d",&n,&m); for(i=0;i<n;++i) scanf("%d",&a[i]); for(j=0;j<m;++j) scanf("%d",&b[j]); get_next(b,m); cout<<KMP(a,n,b,m,nextval,0)<<endl;}}
- hdu 1711
- hdu 1711
- hdu 1711
- hdu 1711
- hdu 1711
- hdu 1711
- HDU 1711
- hdu 1711
- HDU 1711
- hdu-1711
- hdu 1711
- HDU 1711
- HDU 1711
- hdu 1711
- hdu 1711
- HDU 1711
- HDU-1711
- hdu 1711
- 深入Hibernate的flush机制
- linux进程地址空间mm_struct结构体中mm_user和mm_count的疑问
- 生成蜂窝网络图
- 在修改apache的配置文件时重启失败的情况解决
- 输入一个新的网址后到完全显示页面,浏览器做了哪些工作?
- hdu 1711
- ios开发之 xcode使用
- Linux的inode的理解
- Struts action
- 谈谈我对python sys.path的理解
- WIN7 USB无线鼠标 禁止唤醒休眠中的电脑
- C++primer 自由列表(自己写的挫代码,抄书)
- android Bitmap.recycle()的相关问题
- 浏览器内核(解释引擎)