#include <stdio.h>
#include <string.h>
/*
AABCD
CDAA
ASD
ASDF
题意:循环
思路: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;
}
字符串 KMP HDU 2203
最新推荐文章于 2021-02-28 08:34:08 发布
本文介绍了一种使用KMP算法解决字符串循环匹配问题的方法。通过将第一个字符串复制一次并利用KMP算法来检查第二个字符串是否为该组合串的循环子串。文中详细解释了如何构造next数组以及KMP匹配过程。
4009

被折叠的 条评论
为什么被折叠?



