分析

有一道加强版的题解 这里 。那道题要求有多个模板串。而这道题只有一个,那么我们可以通过 来解决。考虑用栈储存路径,遇到完美匹配就返回 步。时间复杂度为

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
char ch[N],S[N],ans[N];
int top = 0,nxt[N],f[N];
int main() {
    scanf("%s%s",ch + 1,S + 1);
    int n = strlen(S + 1);
    for(int i = 2,j = 0;i <= n;i++) {
        while(S[i] != S[j + 1] && j) j = nxt[j];
        if(S[i] == S[j + 1]) j++;
        nxt[i] = j;
    }
    int m = strlen(ch + 1);
    for(int i = 1,j = 0;i <= m;i++) {
        while(ch[i] != S[j + 1] && j) j = nxt[j];
        if(ch[i] == S[j + 1]) j++;
        ans[++top] = ch[i];
        f[top] = j;
        if(j == n) {top -= n;j = f[top];} 
    }
    for(int i = 1;i <= top;i++) printf("%c",ans[i]);
    printf("\n");
    return 0;
}