码迷,mamicode.com
首页 > 其他好文 > 详细

hdoj-2203-亲和串【KMP】

时间:2015-07-27 20:59:29      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

亲和串

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9460 Accepted Submission(s): 4320


Problem Description
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。

Input
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。

Output
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。

Sample Input
AABCD CDAA ASD ASDF

Sample Output
yes no

Author
Eddy

Recommend
lcy | We have carefully selected several similar problems for you: 1358 3336 3746 3068 2202


之前做这题时没学过KMP,直接写的字符串匹配函数,这次用KMP再做一次
#include<stdio.h>
#include<string.h>
//KMP
const int N=100000;
char s1[2*N+10],s2[N+10],next[2*N+10];
void get_next(char *s,int pa){
	next[0]=-1;next[1]=0;
	int i=1,j=0;
	while(i<pa){
		if(j==-1||s[j]==s[i]){
			++i,++j;
			next[i]=j;
		}
		else j=next[j];
	}
}
int KMP(char *s,char *a,int ps,int pa,int ns,int am){
	int i,j;
	i=j=0;
	while(i<ns){
		if(j==-1||s[i]==a[j]){
			++i;++j;
		}
		else j=next[j];
		if(j==am)
		   return i-am+1;
	}
	return -1;
}
int main(){
	while(~scanf("%s%s",s1,s2)){
		int len=strlen(s1);
		if(len<strlen(s2)){
			printf("no\n");
			continue;
		}
		for(int i=0,j=len;i<len;++i,++j){
			s1[j]=s1[i];
		}
		get_next(s1,2*len);
		if(KMP(s1,s2,0,0,2*len,strlen(s2))!=-1)
		printf("yes\n");
		else 
		printf("no\n");
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdoj-2203-亲和串【KMP】

标签:

原文地址:http://blog.csdn.net/qq_18062811/article/details/47090429

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!