KMP hdu2203

#include<stdio.h>
#include<string.h>
int next[100010];
char son[100010], fat[300010], flag[100010];
void getnext(){
	int q, k;
	int m = strlen(son);
	next[0] = 0;
	for(q = 1, k = 0; q < m; q++){
		while(k > 0 && son[q] != son[k]){
			k = next[k - 1];
			//printf("%d %d\n", next[k - 1], k);
		}
		if(son[q] == son[k]){
			k++;
		}
		next[q] = k;
	}	
}

int KMP(){
	int i = 0, j, k;
	int sonLen = strlen(son);
	int fatLen = strlen(fat);
	while(i <= fatLen - sonLen){
		k = 0;
		while(son[0] != fat[i]){
			i++;
		}
		if(son[0] == fat[i]){
			for(j = 0; j < sonLen; j++){
				if(son[j] ==  fat[i + j]){
					k++;
				}
				else{
					break;
				}
			}
			if(k == sonLen){
				return 1;
			}else{
				i += k - next[k - 1];
			}
		}
	}
	return 0;
}
int main(){
	while(gets(fat)){
	int i, lenfat, lenson, lenflag;
	lenfat = strlen(fat);
	gets(son);
	lenson = strlen(son);
	getnext();
	strcpy(flag, fat);
	lenflag = strlen(flag);
	while(lenfat <= lenson){
		strcat(fat, flag);
		lenfat += lenflag;
	}
	strcat(fat, flag);
	lenfat += lenflag;
	if(KMP()){
		printf("yes\n");
	}
	else{
		printf("no\n");
	}
	}
	return 0;
}

發佈了37 篇原創文章 · 獲贊 34 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章