UVA11019 Martix Matcher --- AC自动机
UVA11019 Martix Matcher
題目描述:
給定一個(gè)\(n*m\)的文本串
問(wèn)一個(gè)\(x*y\)的模式串出現(xiàn)的次數(shù)
?
AC自動(dòng)機(jī)的奇妙使用
將\(x*y\)的模式串拆分成x個(gè)串,當(dāng)x個(gè)串在同時(shí)被匹配時(shí),認(rèn)為原串被匹配
但是要區(qū)分匹配的行的差別,因此額外的附加一個(gè)二維數(shù)組\(cnt\)來(lái)表示匹配情況
記\(cnt(i,j)\)表示以\((i,j)\)為左上角的大小為\(x*y\)矩陣匹配了多少行。
將模式串拆成x個(gè)串,建成AC自動(dòng)機(jī)
把文本串的n行放進(jìn)去分別匹配,當(dāng)枚舉到文本串中的第i行第j個(gè)字符時(shí),
如果匹配上了模式串中第k行,那么\(cnt(i - k, j - y + 1) +1\)
最后的答案即為\(\sum_{i=0}^{n-1} \sum_{j=0}^{m-1} [cnt(i,j)==x]\)
?
復(fù)雜度O(\(T(n*m+x*y)\))
?
但是,本題很坑
1.模式串可能有相同的兩行,盡管模式串行結(jié)尾的fail指針不會(huì)互指,但是這種情況下要用鏈表儲(chǔ)存
2.每次清AC自動(dòng)機(jī)不要整個(gè)全部清,會(huì)帶來(lái)極大的復(fù)雜度
3.盡量不要以1作為下標(biāo),討論將變得很復(fù)雜
4.哈希的常數(shù)更優(yōu)
5.本題卡常,如果過(guò)不去,考慮哈希
?
代碼在此
轉(zhuǎn)載于:https://www.cnblogs.com/reverymoon/p/8882299.html
總結(jié)
以上是生活随笔為你收集整理的UVA11019 Martix Matcher --- AC自动机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ios swift版 sqlite3详解
- 下一篇: HDU 6030 Happy Neckl