开一个栈来维护即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
char s[N], p[N];
int nxt[N], num[N];
signed main() {
scanf ("%s%s", s + 1, p + 1);
int n = strlen(p + 1), m = strlen(s + 1);
for (int i = 2, j = 0; i <= n; i ++) {
while (j && p[i] != p[j + 1])
j = nxt[j];
if (p[i] == p[j + 1])
j ++;
nxt[i] = j;
}
stack <int> stk;
for (int i = 1, j = 0; i <= m; i ++) {
while (j && s[i] != p[j + 1])
j = nxt[j];
if (s[i] == p[j + 1])
j ++;
num[i] = j;
stk.push(i);
if (j == n) {
for (int k = 1; k <= n; k ++)
stk.pop();
if (stk.size())
j = num[stk.top()];
else
j = 0;
}
}
stack <int> stk2;
while (stk.size()) {
stk2.push(stk.top());
stk.pop();
}
while (stk2.size()) {
cout << s[stk2.top()];
stk2.pop();
}
cout << '\n';
return 0;
}