zoukankan      html  css  js  c++  java
  • KMP模版

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;
    int next[50005];
    char s[50005],t[50005];
    void getnext()//next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀。
    {
        int i=0,k=-1;
        next[0]=-1;
        int len=strlen(s);
        while(i<len)
        {
            if(s[i]==s[k]||k==-1)
            {
                i++;
                k++;
                next[i]=k;
            }
            else
                k=next[k];
        }
    /*    for(int j=0;j<=len;j++)
            printf("%d ",next[j]);
        printf("
    ");    输出next数组*/
    }
    void kmp()
    {
        int i=0,j=0;
        int lens=strlen(s);
        int lent=strlen(t);
        while(i<lent&&j<lent)
        {
            if(s[j]==t[i]||j==-1)
            {
                i++;
                j++;
            }
            else
                j=next[j];
        }
        if(!j)
            printf("0
    ");
        else
        {
            s[j]='';
            printf("%s %d
    ",s,j);
        }
    }
    int main()
    {
        while(scanf("%s%s",s,t)>0)
        {
            getnext();
            kmp();
        }
        return 0;
    }
    /*思路:这题是有两个字符串,要第一个字符串的最长前缀等于第二个字符串的最长后缀。
    
    这样,根据kmp中next的特性,可以将第一个字符串当作模式串(因为要求它的最长前缀),
    
    第二个字符串当作主串,对两者进行kmp匹配。这样,当主串的i不断往后,而j要是都不匹配的话,
    
    会在-1和0之间往复,当i到了主串后面,开始和模式串匹配时,就可以根据next函数的特性来判断出前缀与后缀相等的最长长度。*/
  • 相关阅读:
    Java内存管理的小技巧
    Java 数组
    cmd命令大全
    wget 使用技巧
    Excellent Eclipse Plugin
    A Tutorial on Clustering Algorithms
    KMeans 算法
    Windowtester Pro Automation test environment Setup using VM Ware Client by Remote Desktop Connection
    POP3、SMTP、IMAP、Exchange
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/4415668.html
Copyright © 2011-2022 走看看