HDU 2594 Simpsons’ Hidden Talents

KMP的应用

看到求字符串的的前缀与后缀,首先想到next数组,但是next所求的是同一个字符串中的最大前缀后缀,本题所求的是两个字符串中的最大前缀后缀,那么我们就求出第一个字符串的next数组,在第二个字符串上跑KMP,等到第二个字符串匹配完了以后,第一个字符串匹配到哪里就是所求的答案。
数组大小要注意

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const int MAXN=50005;
int init(){
	int rv=0,fh=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') fh=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		rv=(rv<<1)+(rv<<3)+c-'0';
		c=getchar();
	}
	return fh*rv;
}
int nxt[MAXN];
char s1[MAXN],s2[MAXN];
void getnxt(){
	int len=strlen(s1);
	nxt[0]=-1;
	int k=-1,j=0;
	while(j<len){
		if(k==-1||s1[j]==s1[k]) nxt[++j]=++k;
		else k=nxt[k];
	}
}
int kmp(){
	int len1=strlen(s1),len2=strlen(s2);
	int i=0,j=0;
	while(j<len2){
		if(i==-1||s1[i]==s2[j]){
			 i++;j++;
		}else i=nxt[i];
	}
	return i;
}
int main(){
	freopen("in.txt","r",stdin);
	while(~scanf("%s %s",s1,s2)){
		getnxt();
		int ans=kmp();
		if(!ans) printf("0\n");
		else{
			for(int i=0;i<ans;i++) printf("%c",s1[i]);
			printf(" %d\n",ans);
		}
	}
	fclose(stdin);
	return 0;
}
posted @ 2017-12-03 19:28  Mr_Wolfram  阅读(139)  评论(0编辑  收藏  举报