题解 P4824 【[USACO15FEB]Censoring (Silver) 审查(银)】
题面
在字符串
|A|
解题思路
KMP+栈
分析
1、字符串匹配的问题,想到
2、在匹配过程中,如果匹配成功了,就将子串
3、删了再加入,类似栈的操作,因此用栈维护上述操作过程中的字串即可
过程
1、
2、在 f[i] 记录的值),继续做
时间复杂度:
Code
#include<bits/stdc++.h>
#define N 1000010
using namespace std;
int la,lb,res;
char a[N],b[N];
int p[N],f[N];//分别表示B串自身匹配的结果、A串与B串匹配的结果
int St[N],top;
int main()
{
int i,j;
scanf("%s",a+1);
scanf("%s",b+1);
la=strlen(a+1);
lb=strlen(b+1);
for(i=2,j=0;i<=lb;i++) {//自身匹配
while(j&&b[i]!=b[j+1])
j=p[j];
if(b[i]==b[j+1])
j++;
p[i]=j;
}
for(i=1,j=0;i<=la;i++) {//A与B匹配
while(j&&a[i]!=b[j+1])
j=p[j];
if(a[i]==b[j+1])
j++;
f[i]=j;//记录结果
St[++top]=i;//入栈
if(j==lb)//如果匹配成功,弹出,并更新j值
top-=lb,j=f[St[top]];
}
for(i=1;i<=top;i++)//大功率输出
printf("%c",a[St[i]]);
return 0;
}
再扔道题 Luogu P3121 [USACO15FEB]审查(黄金)Censoring (Gold)