HDU2203字符串(KMP算法)

http://acm.hdu.edu.cn/showproblem.php?pid=2203

技巧:能前后滚动,实际上用本串连上,例子:abca,连上就是abcaabca,所有情况abca,bcaa,caab,aabc,都有了。

当然本题挺简单用一般方法也可以,但是记得连上时不能用库函数strcat(a1,a2);因为不能strcat(s1,s1);但如果你要再开一个数组当然也可以。。。。

AC代码(KMP算法):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
char s1[maxn*2],s2[maxn];
int next[maxn],l1,l2;
void getnext()
{
    int i=0,j=-1;
    next[0]=-1;
    while(i<l2)
    {
        if(j==-1||s2[i]==s2[j])//此处是模板串内部比较
        {
            i++,j++;
            next[i]=j;
        }
        else
            j=next[j];
    }
}
int kmp()
{
    int i=0,j=0,sum=0;
    while(i<l1)
    {
        if(j==-1||s1[i]==s2[j])
            i++,j++;
        else
            j=next[j];
        if(j==l2)
        {
            sum++;
            j=next[j];
        }
    }
    return sum;
}
int main()
{
    while(scanf("%s%s",&s1,&s2)!=EOF)
    {
        l1=strlen(s1);
        l2=strlen(s2);
        if(l1<l2)
        {
            printf("no\n");
            continue;
        }
        for(int i=0;i<l1;i++)
            s1[l1+i]=s1[i];
        l1=l1*2;
        //printf("* %s *\n",s1);
        getnext();
        if(kmp())
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

 

posted @ 2013-08-14 20:07  拼搏今朝 努力奋进  阅读(133)  评论(0)    收藏  举报