#include <cstdio>
#include <cstring>
void get_next(char *str, int *next) {
size_t len = strlen(str);
memset(next, 0, len * sizeof(int));
if (len==0) return;
next[0] = -1;
char *p = str+1;
while (*p != '\0') {
char *q = str + next[p-1-str];
while (q >= str) {
if (*(p-1)==*q) {
next[p-str] = next[q-str] + 1;
break;
}
q = str + next[q-str];
}
if (q < str) {
next[p-str] = next[0] + 1;
}
++p;
}
next[0] = 0;
}
char *KMP_strstr(char *str1, char *str2) {
int *next = new int[strlen(str2)];
get_next(str2, next);
int index = 0;
char *p = str1;
char *q = str1;
while (*q != '\0') {
char *s = str2 + index;
while (*s==*q && *s!='\0')
++s, ++q;
if (*s=='\0') {
break;
}
index = next[s-str2];
if (s==str2) ++q;
p = q - index;
}
delete [] next;
return p;
}
int main() {
char *str1 = "ababaaababababcaaaa";
char str[] = "ababababca";
char *pch = KMP_strstr(str1, str);
printf("%d\n", pch-str1+1);
return 0;
}
#include <cstdio>
#include <cstring>
void get_next(char *str, int *next) {
next[0] = -1;
char *p = str+1;
while (*p != '\0') {
char *q = str + next[p-1-str];
while (q >= str) {
if (*(p-1) == *q) {
next[p-str] = next[q-str] + 1;
break;
}
q = str + next[q-str];
}
if (q < str) {
next[p-str] = next[0] + 1;
}
++p;
}
}
char *KMP_strstr(char *str1, char *str2) {
int *next = new int[strlen(str2)];
get_next(str2, next);
char *p = str1;
char *q = str2;
while (*p != '\0' && *q != '\0') {
if (q < str2 || *p==*q) ++p, ++q;
else q = str2 + next[q-str2];
}
delete [] next;
if (*q == '\0') return p - (q - str2);
return nullptr;
}
int main() {
char *str1 = "ababaaababababcaaaa";
char str[] = "ababababca";
char *pch = KMP_strstr(str1, str);
printf("%d\n", pch-str1+1);
return 0;
}
#include <cstdio>
#include <cstring>
void get_next(char *str, int *next) {
next[0] = -1;
char *p = str;
char *q = str-1;
while (*(p+1) != '\0') {
if (q<str || *p==*q) {
++q, ++p;
if (*p != *q) next[p-str] = q-str;
else next[p-str] = next[q-str];
}
else q = str + next[q-str];
}
}
char *KMP_strstr(char *str1, char *str2) {
int *next = new int[strlen(str2)];
get_next(str2, next);
char *p = str1;
char *q = str2;
while (*p != '\0' && *q != '\0') {
if (q < str2 || *p==*q) ++p, ++q;
else q = str2 + next[q-str2];
}
delete [] next;
if (*q == '\0') return p - (q - str2);
return nullptr;
}
int main() {
char *str1 = "ababaaababababcaaaa";
char str[] = "ababababca";
char *pch = KMP_strstr(str1, str);
printf("%d\n", pch-str1+1);
return 0;
}