hdu2594Simpsons’ Hidden Talents

方法1:

用KMP不是完全匹配也没事,把第一个当成模式串,第二个当成主串,比到最后就可以得到最后的状态的j,也就是最大匹配数。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 50010
char s1[maxn],s2[maxn];
int next[maxn],len1,len2;
void getnext()
{
    int i=0,j=-1;
    next[0]=-1;
    while(i<len2)
    {
        if(j==-1||s2[i]==s2[j])
        {
            i++,j++;
            next[i]=j;
        }
        else j=next[j];
    }
}
int kmp()
{
    int i=0,j=0;
    while(i<len1&&j<=len2)
    {
        if(j==-1||s1[i]==s2[j])
            i++,j++;
        else j=next[j];
    }
    return j;//此时的j是当i==len1时的j;
}
int main()
{
    while(scanf("%s%s",&s2,&s1)!=EOF)
    {
        len1=strlen(s1);
        len2=strlen(s2);
        memset(next,0,sizeof(next));
        getnext();
        int n=kmp();
        for(int i=0;i<n;i++)
            printf("%c",s2[i]);
        if(n)printf(" ");
        printf("%d\n",n);
    }
    return 0;
}

方法2:
就是连接串1和串2,得到next[]函数,直接得到的next[len3]就是两个串的首尾相同的最大,利用next[]的性质,让我对KMP有了更深度的理解,加油!!!!

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 50010
char s1[maxn],s2[maxn],s3[2*maxn];
int next[2*maxn],len1,len2,len3;
void getnext()
{
    int i=0,j=-1;
    next[0]=-1;
    while(i<len3)
    {
        if(j==-1||s3[i]==s3[j])
        {
            i++,j++;
            next[i]=j;
        }
        else j=next[j];
    }
}
int main()
{
    while(scanf("%s%s",&s1,&s2)!=EOF)
    {
        len1=strlen(s1);
        len2=strlen(s2);
        len3=len1+len2;
        strcpy(s3,s1);
        strcat(s3,s2);
        memset(next,0,sizeof(next));
        getnext();
        if(next[len3])
        {
            if(next[len3]>len1||next[len3]>len2)
            {
                if(len1>len2)printf("%s %d\n",s2,len2);
                else printf("%s %d\n",s1,len1);
            }
            else
            {
                for(int i=0;i<next[len3];i++)
                    printf("%c",s3[i]);
                printf(" %d\n",next[len3]);
            }
        }
        else
            printf("0\n");
    }
    return 0;
}

 

posted @ 2013-08-18 16:39  拼搏今朝 努力奋进  阅读(209)  评论(0)    收藏  举报