[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

 

posted @ 2018-10-02 15:01  SWHsz  阅读(163)  评论(0编辑  收藏  举报