HDU 2594

题目的意思是有两个字符串a,b。  a的最大前缀和b的最大后缀相同几个。  刚开始看题目以为只要先把两个字符串连接一下,然后next数组修改一下就可以后来发现并不对,因为有可能前缀会包含到另一个字符串中。所以只要把第二个字符串当作原串,第一个当作模式串,通过kmp找相同的就可以了。

(不要嘲笑我代码写的难看)!!!!

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <cmath>
#include <set>
#include <climits>
#define INF 0x7fffffff
#define finc(i,a,b) for(i=a;i<=b;i++)
#define fdec(i,a,b) for(i=a;i>=b;i--)
using namespace std;
char s[60000],p[60000];
int next[60000];
void getnext(char *p,int *next)
{
	int i=0,j=-1;
	next[0]=-1;
    int c=strlen(p);
    while(i<c)
    {
    	if(j==-1||p[i]==p[j])
    	{
	    	i++;
	    	j++;
	    	next[i]=j;
	    }
	    else 
	    j=next[j];
    }
}
int kmp(char *s,char *p)
{
	int i=0,j=0;
	getnext(p,next);
	int c=strlen(s);
	int m=strlen(p);
	while(i<c)
	{
		if(j==-1||s[i]==p[j])
		{
			i++;
			j++;
		}
		else
		j=next[j];
	}
	if(i==c&&j>0)
	{
	  return j;
	}
	else
	return -1;	
}

int main()
{
	int i,j;
	while(~scanf("%s",s))
	{
		scanf("%s",p);
		int n=kmp(p,s);
		if(n==-1)
		printf("0\n");
		else
		{
			for(i=0;i<n;i++)
			{
				if(i==n-1)
				printf("%c ",s[i]);
				else
				printf("%c",s[i]);
			}
			printf("%d\n",n);
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值