裸kmp算法
2015-09-01 21:32
197 查看
Number Sequence
[align=left]Problem Description[/align]Given two sequences of numbers : a[1], a[2], ...... , a
, 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.
[align=left]Input[/align]
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
. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
[align=left]Output[/align]
For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
6
-1
刚接触kmp还不是很理解,next失效函数
#include <iostream> #include <cstdio> using namespace std; int f[10001]; int n,m; int a[1000001],b[10001]; int kmp(int t[],int p[]) { int i=0,j=0; while(i<n&&j<m) { if(j==-1||t[i]==p[j]) { i++; j++; } else j=f[j]; } if(j>=m) return i-m+1; return -1; } void next(int p[]) { int k=-1,j=0; f[0]=-1; while(j<m) { if(k==-1||p[k]==p[j]) { k++; f[++j]=k; } else k=f[k]; } } int main() { int T,i,j; //freopen("in.txt","r",stdin); cin>>T; while(T--) { cin>>n>>m; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<m;i++) cin>>b[i]; next(b); cout<<kmp(a,b)<<endl; } }
相关文章推荐
- C++中const的使用
- 10.3-2 10.3-3
- Oracle学习笔记20150901脏读不可重复读以及幻读概念理解
- post 请求 与上传
- greenDAO的使用
- 匈牙利算法(素数伴侣(HW1112))
- DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)
- *POJ 1201 - Intervals(查分约束)
- linux基础篇(磁盘分区)
- poj 3134 Power Calculus(迭代加深dfs+强剪枝)
- 字符串之复制函数
- Objective-C 【autorelease基本使用】
- ZOJ2358解题报告
- ipv6重分发注意项
- android CountDownTimer 倒计时
- Objective-C 【autorelease基本使用】
- 病毒侵袭持续中
- 病毒侵袭持续中
- 功能测试理解
- HDU——3003 Pupu