如何優雅的研究 RGSS3 番外(一) ruby 實現的尾碼自動機

來源:互聯網
上載者:User

標籤:strong   for   re   c   ar   new   

*我真的不會 ruby 呀*



#encoding:utf-8#==============================================================================# ■ Suffix_Automaton#------------------------------------------------------------------------------#  尾碼自動機。#==============================================================================class Suffix_Automaton  #--------------------------------------------------------------------------  # ● 定義執行個體變數  #--------------------------------------------------------------------------  attr_reader   :total                   # 當前 SAM 中不同的子串個數  attr_reader   :root                    # SAM 的根節點  #==============================================================================  # ■ State  #------------------------------------------------------------------------------  #  尾碼自動機的狀態結點。  #==============================================================================  class State    #--------------------------------------------------------------------------    # ● 定義執行個體變數    #--------------------------------------------------------------------------    attr_accessor   :par                     # parent 樹中的父結點    attr_accessor   :go                      # go    attr_accessor   :val                     # val    #--------------------------------------------------------------------------    # ● 初始化狀態結點    #--------------------------------------------------------------------------        def init(val = 0)      @par = nil      @go = []      @val = val      for i in 0..26 do        @go[i] = nil      end    end    #--------------------------------------------------------------------------    # ● 計算結點表示的不同子串數    #--------------------------------------------------------------------------    def calc      return 0 if @par == nil      return @val - @par.val    end  end  #--------------------------------------------------------------------------  # ● 初始化尾碼自動機  #--------------------------------------------------------------------------      def initSAM    @total = 0    @cur = 0    @nodePool = []    @root = newState    @last = @root  end  #--------------------------------------------------------------------------  # ● 建立新的狀態結點  #--------------------------------------------------------------------------      def newState(val = 0)    @nodePool[@cur] = State.new    @nodePool[@cur].init(val)    @cur += 1    return @nodePool[@cur-1]  end  #--------------------------------------------------------------------------  # ● 添加字元  #--------------------------------------------------------------------------      def extend(w)    p = @last    np = newState(p.val + 1)    while p != nil and p.go[w] == nil do      p.go[w] = np      p = p.par    end    if p == nil      np.par = @root      @total += np.calc # 統計    else      q = p.go[w]      if p.val + 1 == q.val        np.par = q        @total += np.calc # 統計      else        nq = newState(p.val + 1)        for i in 0..26 do          nq.go[i] = q.go[i]        end        @total -= q.calc # 統計        nq.par = q.par        q.par = nq        np.par = nq        @total += q.calc + nq.calc + np.calc        while p != nil and p.go[w] == q do          p.go[w] = nq          p = p.par        end      end    end    @last = np  endend  





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.