分析
有一道加强版的题解 这里 。那道题要求有多个模板串。而这道题只有一个,那么我们可以通过 来解决。考虑用栈储存路径,遇到完美匹配就返回
步。时间复杂度为
。
代码
#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;
}
京公网安备 11010502036488号