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]); }