63 lines
1.0 KiB
Plaintext
63 lines
1.0 KiB
Plaintext
|
#include "sylib.h"
|
||
|
|
||
|
void get_next(int str[], int next[])
|
||
|
{
|
||
|
next[0] = -1;
|
||
|
int i = 0, j = -1;
|
||
|
while (str[i]) {
|
||
|
if (j == -1 || str[i] == str[j]) {
|
||
|
j = j + 1;
|
||
|
i = i + 1;
|
||
|
next[i] = j;
|
||
|
}
|
||
|
else
|
||
|
j = next[j];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int KMP(int dst[], int src[])
|
||
|
{
|
||
|
int next[4096];
|
||
|
get_next(dst, next);
|
||
|
|
||
|
int i = 0, j = 0;
|
||
|
while (src[j]) {
|
||
|
if (dst[i] == src[j]) {
|
||
|
i = i + 1;
|
||
|
j = j + 1;
|
||
|
if (!dst[i]) {
|
||
|
return j;
|
||
|
}
|
||
|
} else {
|
||
|
i = next[i];
|
||
|
if (i == -1) {
|
||
|
i = i + 1;
|
||
|
j = j + 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
int read_str(int buf[])
|
||
|
{
|
||
|
int i = 0;
|
||
|
while (1) {
|
||
|
buf[i] = getch();
|
||
|
if (buf[i] == 10)
|
||
|
break;
|
||
|
i = i + 1;
|
||
|
}
|
||
|
buf[i] = 0;
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
int dst[4096], src[4096];
|
||
|
read_str(dst);
|
||
|
read_str(src);
|
||
|
putint(KMP(dst, src));
|
||
|
putch(10);
|
||
|
return 0;
|
||
|
}
|