標籤: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