如何优雅的研究 RGSS3 番外(一) ruby 实现的后缀自动机
2014-07-22 21:54
411 查看
*我真的不会 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 end end
相关文章推荐
- 怎样优雅的研究 RGSS3 番外(一) ruby 实现的后缀自己主动机
- 如何优雅的研究 RGSS3 番外(二) 显示文字信息的窗口中的纤程
- 如何优雅的研究 RGSS3 (六) 技能与物品画面剖析
- 如何优雅的研究 RGSS3 (五) 输入数字的画面
- 如何优雅的研究 RGSS3 (二) 为游戏结束画面添加简单的选项
- 如何优雅的研究 RGSS3 (七) 添加LOGO画面
- 如何优雅的研究 RGSS3 (七) 加入LOGO屏幕
- 如何优雅的研究 RGSS3 (四) 使窗口从画面边缘弹出
- 如何优雅的研究 RGSS3 (三) 调整窗口的细节
- 如何优雅的研究 RGSS3 (一) 场景中窗口的工作原理
- 使用 Ruby r实现如何登录新浪微博
- JavaScript中如何实现多线程异步调用的一点研究
- 后缀自动机实现的例子
- 如何更优雅的实现ExtJS的前端MVC模式下一个App多个Controller的动态加载
- 后缀自动机的程序实现
- Ruby如何实现动态方法调用?
- Ruby如何实现动态方法调用?
- [WPF/Silverlight]INotifyPropertyChanged的实现如何更优雅
- MSDN-如何实现研究,并在命名空间扩展中打开
- RubyChina如何实现喜欢功能?