hdu1867

链接: 点击打开链接
题意:这个题是求两个字符串的最大相同前缀和后缀,典型的KMP算法,但要注意的不要忘记相同时字典序输出,附上自己的代码
代码:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int next[100005];
void get_next(char str2[],int len2)
{
    int k=-1,j=0;
    next[0]=-1;
    while(j<len2)
    {
        if(k==-1||str2[k]==str2[j])
        {
            k++;
            j++;
            next[j]=k;
        }
        else
        k=next[k];
    }
}
int KMP(char str1[],char str2[],int len1,int len2)
{
    int i=0,j=0;
    get_next(str2,len2);
    while(i<len1)
    {
        if(j==-1||str1[i]==str2[j])
        {
            i++;
            j++;
        }
        else
        j=next[j];
    }
    return j;
}  
char str1[100005],str2[100005];
int main()
{
    int len1,len2,i,x,y;
    while(scanf("%s",str1)!=EOF)
    {
        scanf("%s",str2);
        len1=strlen(str1);
        len2=strlen(str2);
        x=KMP(str1,str2,len1,len2);	//因为不知道哪一个是s串,哪一个是p串,所以调用两次KMP,因此写KMP的时候我把数组定义为形参而没定义为全局变量。
        y=KMP(str2,str1,len2,len1);
        //printf("%d %d\n",x,y);
        if(x==y)			//这个不要忘记
        {
            if(strcmp(str1,str2)>0)
            {
                printf("%s",str2);
                printf("%s\n",str1+x);
            }
            else
            {
                printf("%s",str1);
                printf("%s\n",str2+x);
            }
        }
        else if(x>y)
        {
            printf("%s",str1);
            printf("%s\n",str2+x);
        }
        else if(x<y)
        {
            printf("%s",str2);
            printf("%s\n",str1+y);
        }
    }
    return 0;
}



你可能感兴趣的:(hdu1867)