• [USACO15FEB]Censoring (Silver)


    WA了一万次。。。。

    然后发现多输出了一个空格

    我#$%^&

    启示我们输出字符的时候应该输出ASCII码看一下。。。。

    然后本题可以用烤馍片算法,每次匹配完以后看看当前最后一位的nxt数组的值是多少,然后补齐到 lenT 。

    下次匹配的时候直接从上次匹配过的最后一个开始匹配就行了。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    char s[1000005],t[1000005],u[2000005];
    int nxt[2000005],top,lent,lens,last;
    void kmp() {
        for(int i=last+1,j=nxt[last];i<=top;i++) {
            while(j&&u[i]!=u[j+1]) j=nxt[j];
            if(u[i]==u[j+1]) j++;
            nxt[i]=j;
        }
    }
    int main() {
        scanf("%s%s",s,t);
        lens=strlen(s),lent=strlen(t);
        for(int i=0;i<lent;i++) 
            u[i+1]=t[i],u[i+lent+2]=s[i];
        top=lent+lent+1;
        u[lent+1]=' ';
        int tp=lent-1;
        for(int i=2,j=0;i<=lent+lent+1;i++) {
            while(j&&u[i]!=u[j+1]) j=nxt[j];
            if(u[i]==u[j+1]) j++;
            nxt[i]=j;
        }
        last=1;
        while(tp<lens) {
            kmp();
            if(nxt[top]==lent) top-=lent;
            last=top;
            for(int i=1;i<=lent-nxt[last]&&tp<lens;i++) 
            u[++top]=s[++tp];
        }
        for(int i=lent+2;i<top;i++) printf("%c",u[i]);
    }
    Censoring
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    window执行python文件
    百钱买百鸡
    牛的数量有多少
    如何实现杨辉三角
    怎样求解斐波那契数列
    php快速做外包后台开源产品
    如何实现洗牌算法
    如何获取规定的排列组合
    怎样才能得到阿姆斯壮数
    如何利用约瑟夫环来保护你与你的朋友
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9737141.html
Copyright © 2020-2023  润新知