Censoring
Posted fangbozhen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Censoring相关的知识,希望对你有一定的参考价值。
题目描述
给出两个字符串S和T,要求不断从S中删除T,删除T后空缺为补齐,求删完后的字符串。
思路
单字符串匹配,显然我们可以用KMP。先跑一遍KMP的板子,预处理匹配串。接下来就是匹配,由于可能会存在补齐空位后出现的匹配串,而多次扫描不知道要扫描几次,我们可以用栈储存每个字符的位置,如果一个地方匹配完成,我们就出栈m个,再从栈顶开始匹配,最后输出保留在栈中的元素即可。
代码
#include <bits/stdc++.h> using namespace std; const int MAXN=1e6+10; char s[MAXN],t[MAXN]; int pre[MAXN],f[MAXN],st[MAXN]; int main() scanf(" %s %s",s+1,t+1); int n=strlen(s+1),m=strlen(t+1); pre[1]=0; int j=0; for(int i=1;i<m;i++) while(j>0&&t[i+1]!=t[j+1])j=pre[j]; if(t[i+1]==t[j+1])j++; pre[i+1]=j; j=0;int top=0; for(int i=0;i<n;i++) while(j>0&&s[i+1]!=t[j+1])j=pre[j]; if(s[i+1]==t[j+1])j++; f[i+1]=j; st[++top]=i+1; if(j==m) top-=m; j=f[st[top]]; for(int i=1;i<=top;i++) putchar(s[st[i]]); return 0;
以上是关于Censoring的主要内容,如果未能解决你的问题,请参考以下文章