HDU-2549Simpsons’ Hidden Talents

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594

代码如下:

#include<cstdio>
#include<iostream>
#define N 50005
#include<cstring>
using namespace std;
char s[N],s1[N];
int len,ne[N],len1;
void get_next() {
	int i=0,j=-1;
	ne[0]=-1;
	while(i<len) {
		if(j==-1||s[i]==s[j]) {
			i++;
			j++;
			if(s[i]==s[j])
				ne[i]=ne[j];
			else
				ne[i]=j;
		} else
			j=ne[j];
	}
}

int KMP() {//返回s串的前缀和s1 串的后缀匹配的最长长度 
	int i,j;
	for(i=j=0; i<len1;) {
		if(s1[i]==s[j]) {
			i++;
			j++;
		} else {
			j=ne[j];
			if(j==-1) {
				j=0;
				i++;
			}
		}
	}
	return j;
}

int main() {
	while(~scanf("%s%s",s,s1)) {
		int ans;
		len=strlen(s);
		get_next();
		len1=strlen(s1);
		ans=KMP();
		if(!ans)
			printf("0\n");
		else
			printf("%s %d\n",s1+len1-ans,ans);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39564498/article/details/81460673