• 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;
    }
  • 相关阅读:
    HTML基础
    JavaScript基础
    J2EE技术(六)——JSP
    2011.2—至今年度总结
    J2EE技术(二)——JDBC
    DRP项目总结(一)——项目简介
    CSS基础
    J2EE技术(五)——EJB
    J2EE技术(三)——JMS
    J2EE技术(四)——JavaMail
  • 原文地址:https://www.cnblogs.com/leeshum/p/3026888.html
Copyright © 2020-2023  润新知