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