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/archive/2013/04/17/3026888.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值