ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LG4824 「USACO2015FEB」(Silver)Censoring KMP+栈

2019-10-06 22:03:08  阅读:330  来源: 互联网

标签:ch 题解 Censoring && KMP LG4824 strlen Silver


问题描述

LG4824


题解

大概需要回顾(看了题解)

KMP

先对要删除的 模式串 进行自我匹配,求出 \(\mathrm{fail}\)

然后再扫 文本串 的过程中记录一下每个字符匹配的最大长度,用栈进行删除。

这类删除一段连续区间的问题常用栈来优化维护


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

char a[1000007],b[1000007];
int n,m;
int fail[1000007];

void KMP(){
    for(int i=2,j=0;i<=m;i++){
        while(j&&b[i]!=b[j+1]) j=fail[j];
        if(b[i]==b[j+1]) ++j;
        fail[i]=j;
    }
}

int sta[1000007],top;
int opt[1000007];

void solve(){
    for(int i=1,j=0;i<=n;i++){
        while(j&&a[i]!=b[j+1]) j=fail[j];
        if(a[i]==b[j+1]) ++j;
        opt[i]=j;sta[++top]=i;
        if(j==m){
            top-=j;
            j=opt[sta[top]];
        }
    }
    for(int i=1;i<=top;i++) putchar(a[sta[i]]);
    puts("");
}

int main(){
    ios::sync_with_stdio(0);
    cin>>(a+1);n=strlen(a+1);
    cin>>(b+1);m=strlen(b+1);
    KMP();
    solve();
    return 0;
}

标签:ch,题解,Censoring,&&,KMP,LG4824,strlen,Silver
来源: https://www.cnblogs.com/liubainian/p/11628668.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有