hdu2203

也是典型的KMP,只不过将主串变为原来的二倍再用KMP即可,附代码
#include <stdio.h>
#include <string.h>
char str1[100005*2],str2[100005];
int next[100005];
void get_next(int len2)
{
    int k=-1,j=0;
    next[0]=-1;
    while(j<len2)
    {
        if(k==-1||str2[k]==str2[j])
        {
            j++;
            k++;
            next[j]=k;
        }
        else
        k=next[k];
    }
}
int kmp(int len1,int len2)
{
    int i,j;
    i=j=0;
    get_next(len2);
    while(i<len1)
    {
        if(j==-1||str1[i]==str2[j])
        {
            i++;
            j++;
        }
        else
        j=next[j];
        if(j==len2)
        return 1;
    }
    return 0;
}
int main()
{
    int i,len1,len2;
    while(gets(str1))
    {
        gets(str2);
        len1=strlen(str1);
        len2=strlen(str2);
        for(i=len1;i<2*len1;i++)
        str1[i]=str1[i-len1];
        if(kmp(2*len1,len2)==1)
        printf("yes\n");
        else
        printf("no\n");
    }
    return 0;
}

你可能感兴趣的:(hdu2203)