您的位置:首页 > 大数据 > 人工智能

hdu 1867 A + B for you again kmp

2014-05-15 16:44 555 查看
将两个字符串连接起来,中间加一个没出现过的字符,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: