RT,下为代码(萌新代码dalao轻喷):
#include <cstring>
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
const int kMaxN(1000000);
int kNext[kMaxN + 5];
void Kmp(const string&, const string&);
void GetFail(const string&, int);
int main(void) {
string s1, s2;
memset(kNext, 0, sizeof(kNext));
ios::sync_with_stdio(false);
cin >> s1 >> s2;
Kmp(s1, s2);
for (int i = 1; i < s2.size() + 1; ++i) {
if (i != 1)
putchar(' ');
cout << kNext[i];
}
putchar('\n');
return 0;
}
void Kmp(const string& s, const string& p) {
int s_len(static_cast<int>(s.size())), p_len(static_cast<int>(p.size()));
GetFail(p, p_len);
int j(0);
for (int i = 0; i < s_len; ++i) {
while (j && s[i] != p[j])
j = kNext[j];
j += s[i] == p[j];
if (j == p_len)
cout << i - p_len + 2 << endl;
}
}
void GetFail(const string& p, int p_len) {
for (int i = 1; i < p_len; ++i) {
int j(kNext[i]);
while (j && p[i] != p[j])
j = kNext[j];
kNext[i + 1] = p[i] == p[j] ? j + 1 : 0;
}
}