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函数的特性来判断出前缀与后缀相等的最长长度。*/
  • 相关阅读:
    USACO 3.3 A Game
    USACO 3.3 Camelot
    USACO 3.3 Shopping Offers
    USACO 3.3 TEXT Eulerian Tour中的Cows on Parade一点理解
    USACO 3.3 Riding the Fences
    USACO 3.2 Magic Squares
    USACO 3.2 Stringsobits
    USACO 3.2 Factorials
    USACO 3.2 Contact
    USACO 3.1 Humble Numbers
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/4415668.html
Copyright © 2011-2022 走看看