HDU 1711 Number Sequence (简单KMP)
2015-05-28 16:03
267 查看
#include <stdio.h> #include <string.h> int next[10005]; int str1[1000005],str2[10005]; void build_next(int len2) { int i=0,j=-1; next[0] = -1; while (i < len2) { if (j==-1 || str2[i] == str2[j]) { i++; j++; if (str2[i] != str2[j]) { next[i] = j; } else next[i] = next[j]; } else j = next[j]; } } int KMP(int len1,int len2) { build_next(len2); int i=0,j=0,cnt; while (i < len1) { if (j==-1 || str1[i] == str2[j]) { i++; j++; if(j==len2) //在这里判断是否为全部匹配 return i-len2+1; } else j = next[j]; } return -1; //最后还未匹配成功,直接返回-1 } int main() { int N,n,m,i; scanf("%d",&N); while (N--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%d",&str1[i]); for(i=0;i<m;i++) scanf("%d",&str2[i]); if(n<m) printf("-1\n"); else { n=KMP(n,m); printf("%d\n",n); } } return 0; }
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
分析:题目将字符串换成了数字,原理还是一样的,简单KMP
Number Sequence
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13443 Accepted Submission(s): 6058
Problem Description
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.
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
.
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
相关文章推荐
- HDU 1867 A + B for you again(简单KMP)
- (KMP 1.1)hdu 1711 Number Sequence(KMP的简单应用——求pattern在text中第一次出现的位置)
- hdu 1711(KMP的简单应用)
- HDU 2594 Simpsons’ Hidden Talents(简单KMP)
- HDU 2203 kmp简单匹配
- HDU 2087 剪花布条 //简单kmp
- hdu 4763 Theme Section (简单KMP)
- HDU 1358 Period(kmp简单解决)
- HDU 2087剪花布条(简单KMP)
- 剪花布条 - HDU 2087(简单KMP | 暴力)
- hdu_1358_kmp_next_数组简单应用
- HDU 1711 Number Sequence(简单KMP)
- HDU 2203 亲和串(简单KMP,不过需要预判断)
- hdu 1686 Oulipo(简单KMP)只不过比赛的时候用了string.一直超时,改成char就一遍AC,纠结。。。
- hdu 2087(KMP的简单运用)
- hdu-1686-Oulipo(简单滴KMP)
- HDU 2087 剪花布条简单KMP
- HDU:1711 Number Sequence(简单KMP)
- HDU-2087 剪花布条 【KMP简单变型】
- hdu-1686-Oulipo (简单kmp)