zoukankan      html  css  js  c++  java
  • 【string】KMP, 扩展KMP,trie,SA,ACAM,SAM,最小表示法

    【KMP】 


      学习KMP,我们先要知道KMP是干什么的。

      KMP?KMPLAYER?看**?

      正如AC自动机,KMP为什么要叫KMP是因为它是由三个人共同研究得到的- .-

      啊跑题了。

      KMP就是给出一个母串S和串T,然后看T是不是S的子串。

      易想到朴素算法,且时间复杂度是明显的O(NM).

      那么为什么KMP的复杂度会这么高呢?

      因为每次失配的时候,指针只是简单的把在S串的指针向后移动一位,T串回到开头,其中对于子串T已匹配过的信息没有充分利用。

      KMP是干嘛的?

      利用一个next数组使得失配时T的指针不是简单的移动到开头而是移动到T串的某个以匹配位置上。

      在这里还是来说明一下怎么利用next数组吧。

      

      先来说说next数组吧,下面给出T串为abcababdb的各next[i]值。

          

      next数组的意义:当当前位的后一位失配的时候指针应该移动到的位置。

      具体怎么用呢?

      我们设S:abcdabcababcababdb

      T还是那个T。

      

      

      好了,基本就是这些吧。。代码还是贴一贴,为了一些还是不太理解的同学加(chao)深(dai)理(ma)解。什么?next数组怎么求?把t和自己kmp一次就可以啦。。

      

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 
     6 using namespace std;;
     7 
     8 char p[1000],s[10001];
     9 
    10 int next[1001];
    11 
    12 void make_next()
    13 {
    14     for(int q=1,k=0;q<strlen(p);q++)
    15     {
    16         while(k&&p[q]!=p[k]){
    17             k=next[k-1];
    18         }
    19         if(p[q]==p[k]){
    20             k++;
    21         }
    22         next[q]=k;
    23     }
    24 }
    25 
    26 int main()
    27 {
    28     scanf("%s%s",p,s);
    29     make_next();
    30     for(int i=0,k=0;i<strlen(s);i++)
    31     {
    32         while(k&&s[i]!=p[k])
    33             k=next[k-1];
    34         if(s[i]==p[k])k++;
    35         if(k==strlen(p)){
    36             printf("%d
    ",i+1-strlen(p));
    37         }
    38     }
    39     return 0;
    40 }
    View Code

      

      

    【扩展KMP】


    【trie】


    【SA】


    【ACAM】


      待学习。。

    【SAM】


      待学习。。

    貌似好久没写blog了。。

    先挖个大坑慢慢更新。。。

  • 相关阅读:
    在Unity3D中开发的Hologram Shader
    在Unity3D中开发的Toon Shader
    在Unity3D中开发的Dissolve Shader
    2017.2.26
    2017.2.21
    2017.2.20
    2017.2.19
    2017.2.18
    2017.2.17<转>
    2017.2.16 linux
  • 原文地址:https://www.cnblogs.com/tuigou/p/4743557.html
Copyright © 2011-2022 走看看