hdu 1711 KMP

9925 ワード

Sundayのアルゴリズムを学んだばかりで、すべてSundayがKMPより速いと言って、そこで私はSundayで半日打って、ずっとTLEを使って、最後にやはりKMPで过ごしました.Sundayアルゴリズムの理解が正しくないのか、それとも本物の文字列のパターンマッチングにしか向いていないのか分からない.
/*
* hdu1711/linux.cpp
* Created on: 2011-8-20
* Author : ben
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<math.h>

#define MAX_PAR_LEN 10005
#define MAX_TXT_LEN 1000005
int pattern[MAX_PAR_LEN], text[MAX_TXT_LEN];
int nextval[MAX_PAR_LEN], parlen, txtlen;

void get_nextval() {
int i = 0, j = -1;
nextval[
0] = -1;
while (i < parlen) {
if (j < 0 || pattern[i] == pattern[j]) {
i
++;
j
++;
if (pattern[i] != pattern[j]) {
nextval[i]
= j;
}
else {
nextval[i]
= nextval[j];
}
}
else {
j
= nextval[j];
}
}
}

int index_kmp() {
int i, j;
get_nextval();
i
= j = 0;
while (i < txtlen && j < parlen) {
if (j == -1 || text[i] == pattern[j]) {
i
++;
j
++;
}
else {
j
= nextval[j];
}
}
if (j == parlen) {
return i - j;
}
else {
return -2;
}
}

void work() {
int T, i;
scanf(
"%d", &T);
while (T--) {
scanf(
"%d%d", &txtlen, &parlen);
for (i = 0; i < txtlen; i++) {
scanf(
"%d", &text[i]);
}
for (i = 0; i < parlen; i++) {
scanf(
"%d", &pattern[i]);
}
printf(
"%d
", index_kmp() + 1);
}
}

int main() {
#ifndef ONLINE_JUDGE
freopen(
"data.in", "r", stdin);
#endif
work();
return 0;
}