*我真的不会 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

最新文章

  1. 盲注----基于布尔的SQL盲注
  2. 安装Linux系统Fedora 23
  3. Linux DHCP通过OPTION43为H3C的AP下发AC地址(总结)
  4. poi excel导出,下载
  5. python在不同层级目录import模块的方法
  6. SVN更新、清理乱码解决
  7. MPI编程简单介绍
  8. 在有跳板机的情况下,SecureCRT自动连接到目标服务器
  9. 关于新的man版本出现“无法解析 /usr/share/man/zh_CN/man1/ls.1.gz: 没有那个文件或目录“
  10. LittleTools之批量替换工具
  11. nginx+uwsgi+django1.8.5配置
  12. ngrok内网穿透神器
  13. kali rolling 安装typecho
  14. velocity 语法
  15. oracle中decode的一些巧妙用法
  16. Spring Cloud学习笔记-008
  17. 服务器Windows 2008R2 C盘清理
  18. sleep( ) 和 wait( ) 的这 5 个区别,你知道几个?
  19. swoole Tcp服务器
  20. python-面向对象-07_继承

热门文章

  1. Centos7 下安装mysql
  2. AxureRP7超强部件库打包下载
  3. luogu P1325 雷达安装
  4. iOS 文字渐变色
  5. [测试技术分享]DNS域传送漏洞测试
  6. ZK的数据结构特点
  7. SublimeText3插件Emmet自定义HTML
  8. flask-compress的使用方法以及对应的http头Vary、Content-Encoding的意思
  9. iOS:Masonry练习详解
  10. 关于 Delphi 中流的使用(2) 用 TFileStream(文件流) 读写