#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
char str1[1000001];
char str2[1000001];
void getNextArray(char *str, int *next) {
int len = strlen(str);
int k = -1;
int j = 0;
next[0] = -1;
while (j < len - 1) {
if (k == -1 || str[j] == str[k]) {
++k;
++j;
next[j] = k;
//next[j] = (str[j] != str[k] ? k : next[k]); // optimize
} else {
k = next[k];
}
}
}
int searchLongestSubString(char str1[], char str2[]) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int next[len2];
int flag = 0;
getNextArray(str2, next);
int i = 0; // str1 index.
int j = 0; // str2 index.
while (j <= len2 - 1) {
if (str1[i] == str2[j]) {
i++;
j++;
if (j == len2) {
return flag;
}
} else {
i += j - next[j];
flag = i;
j = 0;
if (i + len2 > len1) {
break;
}
}
}
return -1;
}
int main() {
scanf("%s%s", str1, str2);
int result = searchLongestSubString(str1, str2);
cout << result << endl;
return 0;
}
KMP
最新推荐文章于 2025-04-12 10:18:29 发布