数据结构实验之串三:KMP应用
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?
Input
首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。
之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。
Output
如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1
Sample Input
5 1 2 3 4 5 3 2 3 4
Sample Output
2 4
#include <stdio.h> #include <stdlib.h> #include <string.h> int s1[1000005],s2[1000005]; int next[1000005]; int n, m; void get_next(int s[1000005]) { int i = 0; next[0] = -1; int j = -1; while(i < m-1) { if( j == -1 || s[i] == s[j]) { ++i; ++j; if( s[i] != s[j] ) next[i] = j; else next[i] = next[j]; } else j = next[j]; } } void kmp(int *s, int *p) { int i = 0, j = 0, k = 0; int flag = 0; while( i < n ) { while( i < n && j < m) { if( j == -1 || s[i] == p[j]) { i++; j++; } else j = next[j]; } if( j >= m ) { if(flag == 0) { k = i; } flag++; j = -1; } } if(flag == 1) printf("%d %d\n", k-m+1, k); else printf("-1\n"); } int main() { int i; scanf("%d", &n); for(i=0; i<n; i++) { scanf("%d", &s1[i]); } scanf("%d", &m); for(i=0; i<m; i++) { scanf("%d", &s2[i]); } get_next(s2); kmp(s1, s2); return 0; }等待修改。。