P4824 [USACO15FEB]Censoring S(kmp删子串)
题意:
给你S,T字符串,删除S串,重复这个过程,直到不能删为止,删除后字符串会拼接起来
思路:
用栈维护,当删除成功时,出栈至拼接的位置,然后看其next数组位置,继续kmp匹配。
方案打印即为栈内元素。
代码:
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
const int N=1e6+7;
int n,m,idx,f[N],st[N],nt[N];
char a[N],b[N];
int main(){
scanf("%s %s",a+1,b+1);
n=strlen(a+1),m=strlen(b+1);
for(int i=2,j=0;i<=m;i++){
while(j&&b[j+1]!=b[i]) j=nt[j];
if(b[j+1]==b[i]) j++;
nt[i]=j;
}
for(int i=1,j=0;i<=n;i++){
while(j&&b[j+1]!=a[i]) j=nt[j];
if(b[j+1]==a[i]) j++;
f[i]=j;
st[++idx]=i;
if(j==m){
idx-=m;
j=f[st[idx]];
}
}
for(int i=1;i<=idx;i++){
printf("%c",a[st[i]]);
}
printf("\n");
}
/*
zzabccabcabccabccc
abcc
*/