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

原创粉丝点击