字符串 KMP HDU 2203

来源:互联网 发布:移民新西兰 知乎 编辑:程序博客网 时间:2024/05/17 08:03
#include <stdio.h>#include <string.h>/*AABCDCDAAASDASDF题意:循环 思路:KMP  用两倍的长度去 KMP 。首先 判断第一个串的长度是不是 比第二个长 */const int N = 200005;char a[N],b[N];int next[N];int lena,lenb;void getNext(){int j=-1;next[0]=-1;for(int i=1;i<lenb;i++){while(j>=0 && b[i]!=b[j+1])j=next[j];if(b[i]==b[j+1])j++;next[i]=j;}/*for(int i=0;i<len;i++)printf("%d ",next[i]);printf("\n"); */ }int KMP(){int j=-1;for(int i=1;i<lena;i++){while(j>=0 && a[i]!=b[j+1])j=next[j];if(a[i]== b[j+1])j++;if(j==lenb-1)return 1;}return 0;}int main(){while(~scanf("%s%s",a,b)){lena=strlen(a);lenb=strlen(b);if(lena<lenb){printf("no\n");continue;}for(int i=lena;i<2*lena;i++)a[i]=a[i-lena];lena=lena*2;getNext();if(KMP()) printf("yes\n");else printf("no\n");}return 0;}

0 0