hdu 1867 A + B for you again kmp

将两个字符串连接起来,中间加一个没出现过的字符,getfail一下,就是公共部分。

#include <stdio.h>
#include <string.h>
char c[200100];
char a[100100];
char b[100100];
int p[200100];
int solve(int len1,char *a,int len2,char *b)
{
    int len=1;
    int i,j;
    for(i=0;i<len2;i++) c[len++]=b[i];
    c[len]='Z';
    for(i=0;i<len1;i++) c[++len]=a[i];
    j=0;p[1]=0;
    for(i=2;i<=len;i++)
    {
        while(j>0&&c[i]!=c[j+1]) j=p[j];
        if(c[i]==c[j+1]) j++;
        p[i]=j;
    }
    return p[len];
}
int main()
{
    int len,len1,len2;
    int i,j;
    while(scanf("%s",a)!=EOF)
    {
        len1=strlen(a);
        scanf("%s",b);
        len2=strlen(b);
        int ans1=solve(len1,a,len2,b);
        int ans2=solve(len2,b,len1,a);
        if(ans1>ans2)
        {
            printf("%s",a);
            printf("%s\n",b+ans1);
        }
        else if(ans2>ans1)
        {
            printf("%s",b);
            printf("%s\n",a+ans2);
        }
        else
        {
            if(strcmp(a,b)<0)
            {
                printf("%s", a);
                printf("%s\n", b+ans1);
            }
            else
            {
                printf("%s",b);
                printf("%s\n",a+ans1);
            }
        }
    }
    return 0;
}


 

 

posted @ 2014-05-15 16:44  贝尔摩德  阅读(130)  评论(0编辑  收藏  举报