1711 Number Sequence(kmp)
2016-05-12 20:22
369 查看
[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
[align=left]Source[/align]
HDU 2007-Spring Programming Contest
[align=left]Recommend[/align]
lcy | We have carefully selected several similar problems for you: 1358 3336 3746 1867 2203
题解:kmp模板 编译错误了多次,无爱啦...
代码:
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
[align=left]Source[/align]
HDU 2007-Spring Programming Contest
[align=left]Recommend[/align]
lcy | We have carefully selected several similar problems for you: 1358 3336 3746 1867 2203
题解:kmp模板 编译错误了多次,无爱啦...
代码:
#include <iostream> #include <cstdio> using namespace std; int p[10010],s[1000010]; int n,m; int nex[10010]; void get() { int plen=m; nex[0]=-1; int k=-1,j=0; while(j < plen){ if(k==-1 || p[j] == p[k]){ ++j; ++k; if(p[j] != p[k]) nex[j]=k; else nex[j]=nex[k]; } else{ k=nex[k]; } } } int kmp() { int i=0,j=0; int slen=n; int plen=m; while(i < slen && j< plen){ if(j==-1 || s[i]==p[j]){ ++i; ++j; } else{ j=nex[j]; } } if(j == plen) return i-j+1; else return -1; } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%d",&s[i]); for(int i=0; i<m; i++) scanf("%d",&p[i]); get(); printf("%d\n",kmp()); } }
相关文章推荐
- Android的线程使用来更新UI------Thread Handler Looper TimerTask等
- 303. Range Sum Query - Immutable
- Adnroid5.1 最近应用分析(systemui-recents)
- vue-cli学习开发总结
- easyui --单元格编辑
- Partition-方案二:通过 Insert with a subquery 方法
- android UI——跑马灯TextView
- iOS UIKit:TableView之编辑模式(3)
- Android 查询远程服务器的工具QueryUtils
- UI layout 优化
- UI 增加热点区域
- AndroidStudio导入项目一直Building解决方案
- c# 解析json 字符串 报异常 Bad JSON escape sequence 解决方案
- Arduino 高级教程 02:用 Visual Studio 2015 开发 Arduino 应用程序(一)
- UIButton的方法
- marquee,图片连续滚动,不留空白
- UITextView
- zoj 1649 Rescue【BFS+优先队列】
- UIProgress
- Codeforces 141C Queue 【构造】