HDU2594【KMP】

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2594

【分析】求最长的str1的前缀同时满足是str2的后缀,把它们连在一起,从连接后从d=nex[len]开始找,直到长度小于等于str1或者str2的长度的最小值为止

#include<iostream>
#include<string>
#include<cstring>

using namespace std;
const int M=50000+10;

char str1[M*2];
char str2[M];
int nex[M*2];
int len;
void getnex()
{
	nex[0]=-1;
	int i=0,j=1;
	while(j<len)
	{
		if(i==-1 || str1[i]==str1[j])
		{
			i++;
			j++;
			nex[j]=i;
		}
		else
			i=nex[i];
	}
}

int main()
{
	while(scanf("%s%s",str1,str2)!=EOF)
	{
		
		int l1=strlen(str1);
		int l2=strlen(str2);
		strcat(str1,str2);
		len=strlen(str1);
		getnex();
		int d=nex[len];
		while(d>l1 || d>l2)  //直到长度小等于短串的长度
			d=nex[d];
		if(d==0)
			printf("0\n");
		else
		{
			str1[d]=0;
			printf("%s %d\n",str1,d);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40317006/article/details/81319252
今日推荐