郁郁青青 长过千寻

aho-corasick自动机

    字符串

  1. INSERT(buf)
  2. BUILD()
  3. QUERY(buf)

INSERT(buf)

1
2
3
4
5
6
7
8
9
len:=组成trie树的单词buf长度
now:=root即0
for i:=0 to len-1
ch:=buf[i]的英文序列如25表示z
if nxt[now,ch]=-1
nxt[now,ch]:=NEW() endif
now:=nxt[now,ch]
endfor
end[now]:=end[now]+1

BUILD()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
建队列q
for i=0 to 英文字母个数-1
if nxt[root,i]=-1
nxt[root,i]:=root
else
fail[nxt[root,i]]:=root
nxt[root,i]入q队
endif endfor
while q队不空
now:=出q队并返回值
for i:=0 to 25
if nxt[now,i]=-1
nxt[now,i]:=nxt[fail[now],i]
else
fail[nxt[now,i]]:=nxt[fail[now],i]
nxt[now,i]入q队
endif endfor endwhile

QUERY(buf)

1
2
3
4
5
6
7
8
9
10
11
12
len:=查询trie数的字符串buf长度
now:=root
res:=0
for i=0 to len-1
now:=nxt[now,buf[i]的英文序列]
tmp:=now
while tmp!=root
res:=res+end[tmp]
end[tmp]:=0
tmp:=fail[tmp]
endwhile endfor
return res
页阅读量:  ・  站访问量:  ・  站访客数: