[BZOJ3942][Usaco2015 Feb]Censoring(栈+kmp)

来源:互联网 发布:新浪微博数据冗余 编辑:程序博客网 时间:2024/04/28 23:54

题目描述

传送门

题解

首先kmp求出来失配函数,然后暴力匹配。
如果当前位可以匹配,那么将其压入栈中;如果不能匹配,蹦到它的失配开始匹配;如果有一个完整的子串被压入栈中了,暴力将这个子串弹出。
注意弹出了一个串了之后要恢复到栈顶元素之前匹配到的位置 。
这样的话最终弹出的都是合法的串,没有弹出的就是无法匹配的。

代码

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 1000005char s[N],w[N];int lw,ls,T[N],stack[N],loc[N],top;void calc_T(){    T[0]=-1;    for (int i=0,j;i<lw;++i)    {        j=T[i];        while (j!=-1&&w[i]!=w[j])            j=T[j];        T[i+1]=++j;    }}int main(){    scanf("%s",s);ls=strlen(s);    scanf("%s",w);lw=strlen(w);    calc_T();    for (int i=0,j=0;i<ls;++i)    {        while (j!=-1&&s[i]!=w[j])            j=T[j];        ++j;        stack[++top]=i;        loc[top]=j;        if (j==lw)        {            for (int k=1;k<=lw;++k)                --top;            j=loc[top];        }    }    for (int i=1;i<=top;++i)        putchar(s[stack[i]]);}
0 0
原创粉丝点击