上週學習了字尾自動機。
於是蒟蒻ldx
ldxld
x在dzyo
dzyo
dzyo
和z xy
oi
zxyoi
zxyo
i的引導下逐漸對sam
samsa
m這個東西有了自己的認識。
為啥會有sam
samsa
m這個東西?
因為s am
samsa
m可以做到利用o(n
)o(n)
o(n)
的時空來識別乙個字串的n
2n^2
n2個字串。
因為s am
samsa
m am
samsa
m建出的par
en
tparent
parent
樹將所有狀態的從屬關係從圖形轉化成了樹形。
因為s am
samsa
m建出的par
en
tparent
parent
樹正是其反串的字尾樹。
…自動機上的轉移邊
要談轉移邊,就先要提到乙個神奇的詞語:狀態。
還記得在學習搜尋的時候,我們就已經開始接觸狀態這個詞語了。
我對狀態的理解就是:記錄了某一類具有相同性質的事物的集合
而對於sam
samsa
m來說也同樣是這樣:同乙個狀態中的字串都有著相同的特點:end
po
sendpos
endpos
集合相同。這些都是後話了
而兩個狀態之間的聯絡正是神奇的轉移邊。
也就是說,乙個字串被識別的過程正對應著dag
dagda
g上的一條路徑。
並且,這個關係是乙個雙射,即唯一的乙個字串對應著一條唯一的路徑妙不可言。
max
le
nmaxlen
maxlen
陣列的妙用
在構建好sam
samsa
m之後,設乙個狀態的大小為[mi
nlen
i,ma
xlen
i]
[minlen_i,maxlen_i]
[minle
ni,
maxl
eni
]。其字尾鏈結是lin
ki
link_i
linki
,那麼有性質:min
leni
=max
lenl
inki
+1
minlen_i=maxlen_+1
minlen
i=m
axle
nlin
ki
+1還有就是兩個狀態的lcp
lcplc
p就是其lca
lcalc
a的maxl
en
maxlen
maxlen
大小。sam
samsa
m與回文串的判斷
對原串建立乙個字尾自動機,然後用反串在上面匹配。
如果當前匹配的區間[l,
r]
[l,r]
[l,r
]包裹了當前狀態的end
po
sendpos
endpos
中的最大值,那麼[l,
maxp
os
][l,maxpos]
[l,max
pos]
就是乙個回文串。
廣義sam
samsa
m
即對於所有的母串建立的字尾自動機。
廣義s am
samsa
m的3種建法:
5.1. 每建完乙個字串之後把las
tlast
last
指向根節點
5.2. 乙個乙個建,如果當前已經有相同轉移就看是否需要**
5.3. 離線bfs
bfsbf
s按照層劃分順序來建。
sam
samsa
m可以解決的問題(動態更新)
最長公共子串
第k
kk小的子串
第k
kk小的本質不同的子串
某乙個字串在另乙個字串裡的出現次數
模板求公共子串個數
求最長公共子串長度
求所有回文串出現次數
給兩個字串,讓你求長度不小於k的公共子串的數量
給出最多10個串求最長公共子串
求第k
kk小子串
求長度為1~n的子串出現次數的最大值
支援動態在串尾插入字元,查詢在串中出現超過k次的子串的個數
求
求求字尾兩兩lcp
lcplc
p之和給出n個字串,對每個串求出有多少個子串在至少k個字串中出現過
給出一棵trie樹,求樹上所有路徑組成的不同字串數
給乙個字串,對於每個位置求出經過這個位置且只在字串中出現一次的子串的長度的最小值
關於tv app的一些想法
以前是做iptv機頂盒的,現在是做網際網路電視機頂盒的,在技術上的區別是不大的。通過這些年與電信,廣電打交道,現在對產品有了一些小想法。那麼在顯示上都是以web為主,用web來顯示epg內容,用osd來顯示狀態。但是隨著android的出現,現在大部分機頂盒或電視劇集廠家,都開始了智慧型之旅。乙個是...
關於敏捷的一些想法
敏捷軟體開發宣言 個體和互動 勝過 過程和工具 可以工作的軟體 勝過 面面俱到的文件 客戶合作 勝過 合同談判 響應變化 勝過遵循計畫 今天看了robert martin的ppp一書的第一部分,敏捷開發 回顧了自己曾經加盟過的幾個公司,經歷過的大大小小的專案,感慨良多。這些公司中不乏奉過程開發為寶典...
關於 Apple Metal API 的一些想法
更方便和友好的多執行緒 gpu 渲染支援 gles 的設計,所有東西都必須跟乙個 gl context 繫結,由 gl context 內部所控制的狀態機驅使,而 gl context 又跟單個執行緒本身緊密繫結在一起,導致很難支援構建乙個良好的多執行緒 gpu 渲染架構,chrome 的解決辦法是...