3942: [Usaco2015 Feb]Censoring KMP

维护一个栈跑KMP,如果匹配成功就删去回到匹配前的位置继续匹配。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[1000005],t[1000005],ans[1000005];
int n,m,top,p[1000005],pos[1000005];
int main()
{
    scanf("%s",s+1); n=strlen(s+1); 
    scanf("%s",t+1); m=strlen(t+1);
    int j=0; p[1]=0;
    for (int i=2;i<=m;i++)
    {
        while (j&&t[j+1]!=t[i]) j=p[j];
        if (t[j+1]==t[i]) j++;
        p[i]=j;
    }
    j=0;
    for (int i=1;i<=n;i++)
    {
        ans[++top]=s[i];
        while (j&&t[j+1]!=ans[top]) j=p[j];
        if (t[j+1]==ans[top]) j++;
        if (j==m) top-=m,j=pos[top];
        else pos[top]=j;
    }
    for (int i=1;i<=top;i++) putchar(ans[i]);
    return 0;
}

你可能感兴趣的:(3942: [Usaco2015 Feb]Censoring KMP)