hdu 1867 最长公共前缀和后缀

题意描述不太好,说好是A+B,却可以B+A,虽然理论上是这样,但我觉得题意说清楚些比较好

我的做法和网上的题解不一样,比如asdf sdfg

我把第一个字符串接在第二个的后面,形成

sdfgasdf,长度一共为8,然后找next【8】,next【8】就是最长公共串的长度(为什么是这样,请看题解poj 2752)

然后把第二个字符串接在第一个的后面,再找下,

最后对比下哪个长点,就输出哪个,有个东西不好处理,aaaaaaaa aaa

如果是这样的话,直接输出较长的

#include<stdio.h>
#include<string.h>
#include<cstring>
#define val 100005
int lens,lenp,next[val*2],lenv,Min;
char s[val],p[val],an[val*2];
bool in[val*2];
int set_next();
int main()
{
	int i,temp,first,second;
	while(scanf("%s",s)!=EOF)
	{
		scanf("%s",p);
		lenp=strlen(p);
		lens=strlen(s);
		Min=lenp<lens?lenp:lens;
		lenv=lenp+lens;
		strncpy(an,p,lenp);
		strncpy(an+lenp,s,lens);
		set_next();
		first=set_next();//p在前
	/*	for(i=0;i<=lenv;i++)
			printf("%d ",next[i]);*/
		strncpy(an,s,lens);
		strncpy(an+lens,p,lenp);
		second=set_next();//s在前
//		printf("FIRST:%d    sec:%d\n",first,second);
		if(first==second)
		{
			if(strncmp(s,p,Min)==0)
			{
				if(Min==lenp) puts(s);
				else puts(p);
				continue;
			}
			if(strcmp(p,s)<0)
				printf("%s%s\n",p,s+second);
			else printf("%s%s\n",s,p+second);
		}
		else if(first>second)
		{
			printf("%s%s\n",s,p+first);
		}
		else
			printf("%s%s\n",p,s+second);
		memset(s,0,sizeof(s));
		memset(p,0,sizeof(p));
	}
	return 0;
}
int set_next()
{
	int k,j;
	k=-1,j=0;
	next[j]=k;
	while(j<lenv)
	{
		if(k==-1||an[j]==an[k])
		{
			k++;
			j++;
			next[j]=k;
		}
		else k=next[k];
	}
	return next[lenv];
}


你可能感兴趣的:(hdu 1867 最长公共前缀和后缀)