hdu2594

KMP求最长相同前缀和后缀,注意末尾空格问题,附代码

#include <stdio.h>
#include <string.h>
char str1[50005],str2[50005];
int next[50005];
void get_next(int len2)
{
    int j=0,k=-1;
    next[0]=-1;
    while(j<len2)
    {
        if(k==-1||str2[j]==str2[k])
        {
            k++;
            j++;
            next[j]=k;
        }
       else
            k=next[k];
   }
}
int kmp(int len1,int len2)
{
    int i=0,j=0;
    get_next(len2);
    while(i<len1)
    {
        if(j==-1||str1[i]==str2[j])
        {
            i++;
            j++;
        }
        else
            j=next[j];
    }
    return j;
}
int main()
{
    int i,len1,len2,n;
    while(gets(str2))
   {
        gets(str1);
        len1=strlen(str1);
        len2=strlen(str2);
        n=kmp(len1,len2);
        for(i=0;i<n;i++)
        putchar(str2[i]);
        if(n)
        printf(" ");
        printf("%d\n",n);
    }

    return 0;
}

你可能感兴趣的:(hdu2594)