hdu 1711 Number Sequence

        hdu 1711 Number Sequence

        kmp基礎題.

#include <stdio.h>

#define MAX 10005

int n, m;
int a[MAX*100], b[MAX];
int next[MAX];

void getNext(int* arr, int* next) {
	int j, k;

	j = 0;
	k = -1;
	next[0] = k;

	while (j < m - 1) {
		if (k == -1 || arr[k] == arr[j]) {
			++k, ++j;

			if (arr[k] == arr[j]) {
				next[j] = next[k];
			} else {
				next[j] = k;
			}
		} else {
			k = next[k];
		}
	}
}

int kmp(int* a, int* b) {
	int i, j;

	i = j = 0;
	getNext(b, next);

	while (i < n) {
		if (j == -1 || a[i] == b[j]) {
			++j, ++i;
		} else {
			j = next[j];
		}

		if (j == m) {
			return i - m + 1;
		}
	}

	return -1;
}

int main() {
	int T;
	int i;

	while (scanf("%d", &T) != EOF) {
		while (T--) {
			scanf("%d%d", &n, &m);

			for (i = 0; i < n; i++) {
				scanf("%d", &a[i]);
			}

			for (i = 0; i < m; i++) {
				scanf("%d", &b[i]);
			}

			printf("%d\n", kmp(a, b));
		}
	}

	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章