from:https://www.cnblogs.com/yjiyjige/p/3263858.html
模板:
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int N = 1e5; //字符串最大长度
string s, t; //s主串,t模式串
int Next[N]; //不匹配时需要移动的位置
void findNext() {
int k = -1;
int i = 0;
memset(Next, -1, sizeof Next);
while (i < t.length() - 1) {
if (k == -1 || t[i] == t[k]) { //有重复的字符时
if (t[++i] == t[++k]) // 当两个字符相等时要跳过
Next[i] = Next[k];
else
Next[i] = k;
} else
k = Next[k];
}
}
int KMP() {
int i = 0, j = 0;
while (i != s.length() && j != t.length()) {
if (j == -1 || s[i] == t[j]) { //当j为-1时,要移动的是i,当然j也要归0
i++;
j++;
} else
j = Next[j]; //j回到指定位置
}
if (j == t.length()) //找到匹配的
return i - j;
else
return -1;
}
int main() {
cin >> s >> t;
findNext();
int tPos = KMP();
if (tPos == -1)
cout << "Not has t!" << endl;
else
cout << "t is in " << tPos << "!" << endl;
return 0;
}
/*
Input:
bacbababadababacambabacaddababacasdsd
ababaca
Output:
t is in 10!
*/

京公网安备 11010502036488号