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

HDU 1867 A+B for you again

2011-09-15 22:48 381 查看
这道题的意思就是找出一个最大的公共子串,这个子串是一个字符串的尾串(tail substring ),同时是另外那个字符串的头串(head substring),是满足A+B的长度strlen(A+B)达到最小值,这里面要注意的一个问题是,谁做模式串P是不一定的,所以要分别比较不同字符串作为模式的KMP值。

这里用到KMP匹配算法里面的next函数,KMP返回的就是那个公共子串的长度。

View Code

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
int next[100010];
void getNext(char P[])
{
int j=0,k=-1;
next[0]=-1;
int lenP=strlen(P);
while(j<lenP)
{
if(k==-1 || P[j]==P[k])
{
k++;j++;
next[j]=k;
}
else
k=next[k];
}
}
int KMP(char T[],char P[])
{
memset(next,0,sizeof(next));
getNext(P);
int posP=0,posT=0;
int lenT=strlen(T);
while(posT<lenT)
{
if(posP==-1 || P[posP]==T[posT])
{
posP++;posT++;
}
else
posP=next[posP];
}
return posP;
}
char S1[100005],S2[100005];
int main()
{
while(scanf("%s %s",S1,S2)!=EOF)
{
int len1=KMP(S1,S2);
int len2=KMP(S2,S1);
if(len1==len2)
{
if(strcmp(S1,S2)<0)
{
printf("%s%s\n",S1,S2+len1);
}
else
{
printf("%s%s\n",S2,S1+len1);
}
}
else
if(len1<len2)
{
printf("%s%s\n",S2,S1+len2);
}
else
printf("%s%s\n",S1,S2+len1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: