hdu 1867 史上最裸KMP 第二弹
来源:互联网 发布:影视片头特效制作软件 编辑:程序博客网 时间:2024/06/05 18:49
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int maxn=100012;char a[maxn],b[maxn];int next[maxn],n,m;void NEXT(char s1[],int len){ int i,j; memset(next,0,sizeof(next)); for(i=1;i<len;i++) { j=next[i-1]; while(j&&s1[i]!=s1[j]) j=next[j-1]; if(s1[i]==s1[j]) { next[i]=j+1; }else next[i]=0; }}int KMP(char s1[],char s2[],int len){ int i,j=0; for(i=0;i<len;i++) { while(j&&s1[i]!=s2[j])j=next[j-1]; if(s1[i]==s2[j]) j++; else j=0; } return j;}int main(){ // freopen("//media/学习/ACM/input.txt","r",stdin); while(scanf("%s%s",a,b)!=EOF) { int i,j,key=1,ans=1<<29; n=strlen(a); m=strlen(b); NEXT(b,m); j=KMP(a,b,n); key=j; ans=n+m-j; NEXT(a,n); j=KMP(b,a,m); if(ans<n+m-j) { cout<<a; for(i=key;i<m;i++) cout<<b[i]; cout<<endl; } else if(ans==n+m-j) { if(strcmp(a,b)<=0) { cout<<a; for(i=key;i<m;i++) cout<<b[i]; cout<<endl; } else { cout<<b; for(i=j;i<n;i++) cout<<a[i]; cout<<endl; } }else { cout<<b; for(i=j;i<n;i++) cout<<a[i]; cout<<endl; } } return 0;}