程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> NYOJ327 親和串[KMP]

NYOJ327 親和串[KMP]

編輯:C++入門知識

 

 

親和串

時間限制:1000 ms | 內存限制:65535 KB 難度:3
描述
最近zyc遇到了一個很棘手的問題:判斷親和串,以前判斷親和串的時候直接可以看出來,但現在不同了,現在給出的兩字符串都非常的大,看的zyc頭都暈了。於是zyc希望大家能幫他想一個辦法來快速判斷親和串。親和串定義:給定兩個字符串s1和s2,如果能通過s1循環移動,使s2包含在s1中,那麼我們就說s2是s1的親和串。
輸入
本題有多組測試數據,每組數據的第一行包含輸入字符串s1,第二行包含輸入字符串s2,s1與s2的長度均小於100000。
輸出
如果s2是s1的親和串,則輸出"yes",反之,輸出"no"。每組測試的輸出占一行。
樣例輸入
AABCD
CDAA
ASD
ASDF
樣例輸出
yes
no

 

 

 

#include 
#include 
#define maxn 100000 + 5
char str1[2 * maxn], str2[maxn];
int next[maxn], len1, len2;;

void getNext(){
	int j = -1, i = 0;
	next[0] = -1;
	while(i < len2){
		if(j == -1 || str2[i] == str2[j]){
			++i; ++j;
			if(str2[i] != str2[j]) next[i] = j;
			else next[i] = next[j];
		}else j = next[j];
	}
}

bool KMP(){
	getNext();
	int i = 0, j = 0;
	while(i < len1 && j < len2){
		if(j == -1 || str1[i] == str2[j]) ++j, ++i;
		else j = next[j];
	}
	return j == len2;
}

int main(){
	while(scanf("%s%s", str1, str2) == 2){
		len1 = strlen(str1);
		len2 = strlen(str2);
		if(len1 < len2){
			printf("no\n");
			continue;
		}		
		memcpy(str1 + len1, str1, len1);
		len1 *= 2;
		if(KMP()) printf("yes\n");
		else printf("no\n");
	}
	return 0;
}        


 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved