链接:
点击打开链接
题意:这个题是求两个字符串的最大相同前缀和后缀,典型的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;
}