题意:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/73d4f5b75bae5ade6e7347b90c37c707.png)
(题目来源:洛谷)
解题思路:
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
string s1, s2;
int nxt[maxn];
void getnxt() {
int l2 = s2.size(), i = 0, j = -1;
nxt[i] = j;
while (i < l2) {
if (j == -1 || s2[i] == s2[j]) i++, j++, nxt[i] = j;
else j = nxt[j];
}
}
stack <char> sta1, sta2;
void kmp() {
int l2 = s2.size(), j = 0;
sta2.push(sta1.top()), sta1.pop();
while (!sta1.empty()) {
if (j == l2 - 1 && sta2.top() == s2[j]) {
int num = 0;
while (num < l2) sta2.pop(), num++;
num = 0;
while (num < l2 && !sta2.empty()) sta1.push(sta2.top()), sta2.pop(), num++;
if (sta2.empty()) sta2.push(sta1.top()), sta1.pop();
j = 0;
}
if (j == -1 || sta2.top() == s2[j]) {
j++;
if (!sta1.empty()) sta2.push(sta1.top()), sta1.pop();
}
else j = nxt[j];
}
if (j == l2 - 1 && sta2.top() == s2[j]) {
int num = 0;
while (num < l2 && !sta2.empty()) sta2.pop(), num++;
}
}
int main() {
cin >> s1 >> s2;
getnxt();
for (int i = s1.size() - 1; i >= 0; i--)
sta1.push(s1[i]);
kmp();
string ans = "";
while (!sta2.empty()) ans += sta2.top(), sta2.pop();
for (int i = ans.size() - 1; i >= 0; i--)
cout << ans[i];
}