HDU 2594 Simpsons’ Hidden Talents

   做这道题的时候,我对KMP也是没有什么概念。。然后学长说,利用next数组就可以。思考了一下,觉得next数组大概是个这么回事:next数组是在第i个字符“失配”的情况下,跳转到next[i]所指向的第j个字符,再进行匹配。这样来看,既然可以跳转,那就说明i前面的字符一直到j后面一个字符这k个字符与j前面的k个字符就是一模一样的!如果不是这样,那么i失配的情况下,就不可以跳到j字符。

   

#include<stdio.h>
#include<string.h>
char s1[100005],s2[50005];
int next[100005];
void get_next(char t[100005])
{
    int i=0,j=-1,len;
    next[0]=-1;
    len=strlen(t);
    while(i<len)
    {
        if(j==-1||t[i]==t[j])
        {++i;
        ++j;
        next[i]=j;
        }
        else j=next[j];
    }
}
int main()
{
    int len1,len2,i,j,sum,min;
    char ch;
    while(scanf("%s",s1)!=EOF)
    {   ch=getchar();
        len1=strlen(s1);
        gets(s2);
        len2=strlen(s2);
        strcat(s1,s2);
        get_next(s1);
        i=strlen(s1);
        if(len1>len2)
            min=len2;
        else min=len1;

    while(i>min&&i>0){
        i = next[i];
    }
    s1[i] = '\0';
    if(i!=0)
    printf("%s %d\n",s1,i);
    else
    printf("%d\n",i);
}

    

 return 0;
}
原文地址:https://www.cnblogs.com/leeshum/p/3026888.html