題意:
求目標串中每個模式串出現幾次
目標串長度<=2000000 模式串<=1000個 模式串長度<=50
題解:
這不就是ac自動機的模板題嗎!
求fail樹中模式串的子樹中有幾個是目標串的節點就完了- -
但是 這樣做不是太沒意思了 (← ←...)
昨天晚上聽說字尾陣列好像可以完美替代ac自動機(事實上是不行的)
於是就拿出了這道題 思考如何用字尾陣列解決
其實一想還是挺簡單的
先把這些串接起來 求個sa和hi
記第i個模式串的的位置是sp[i]
顯然包含模式串i的字尾在sa中肯定跟sp[i]相鄰
我們只要往兩個方向列舉求幾個是目標串的即可
q1:
這時時間複雜度為o(模式串個數*串總長度)=o(2*10^9)
tle!優化?
將屬於目標串的字尾賦值為1
線段樹維護sa中區間連續某段的和 即可將時間複雜度縮為o(模式串個數*log串總長度)
q2:
但是有個問題 怎麼快速求出詢問的區間範圍?
列舉?那複雜度不是又變回去了- - 主席樹!
這個區間範圍就是該點左邊、右邊hi《該模式串的長度的第乙個點
我們可以主席樹logn求之
但是這個方法的bug還是很多的- -
比如說這題時限只有1s o(nlogn) 還是很艱難的
還有空間複雜度也要差不多o(nlogn) mle毫無壓力- -
hdu 3065 病毒侵襲持續中
題目大意及思路 ac自動機。include include include include include include include include include include includeusing namespace std define inf 0x3f3f3f3f define ...
HDU 3065 病毒侵襲持續中
這就更簡單了,都不用把out標記成false了 題目中的病毒都是大寫字母這個條件應該怎麼用?include include include include include include include include include include include include include ...
HDU 3065 病毒侵襲持續中
詢問每個模式串在文字傳中出現的次數。文字串中出現的字元不一定都是大寫字母,只需要在匹配的時候,對文字串進行特殊處理,將連續的大寫字母段當成合法的乙個文字串即可。然後 就是簡單的統計了。include include include include include include using name...