字串專題小結

2021-07-09 02:17:05 字數 3468 閱讀 1336

字串專題算是搞得差不多了,來大概總結一下吧。

要掌握的演算法: 1、

kmp演算法

作用是兩個串之間的匹配,核心思想是pre[i]表示串b的最長的字首與以i為結尾的字尾相同,每次匹配失敗時,從i跳到pre[i]就可以了。

2、trie樹

作用是儲存許多個串,核心思想是除根節點每個點表示乙個字母,從根節點到每個點的路徑表示乙個字串,單詞節點打上標記

3、ac自動機

作用是多個串的匹配,kmp+trie樹,核心思想是fail[i]表示長度最長的某個字首是i節點所代表的字串的乙個字尾,通過fail[i]處理出ch[x][i]表示x節點加入乙個i字元後轉移到的節點。注意可以結合dp來考察。

4、manacher演算法

作用是處理出以每個位置為中心的最長回文串長度,核心思想是記錄乙個最長的延伸到的地方,利用對稱的思想處理出乙個當前位置的起始值,之後暴力匹配,比較神奇,時間複雜度很好證明。

5、字尾陣列

作用是對單個字串字尾排序,求兩個字尾的lcp,核心思想是sa陣列和height陣列的求法,詳見**,不再過多贅述。

6、字尾自動機

作用是對單串建立自動機,能夠給接受該串的每個子串,核心思想是每個節點代表多個字串,其中每個節點的right集合相同,記錄乙個fa[i]表示最小的right集合使i的right集合是它的子集,具體還是要看**。應用更加廣泛。

7、hash

作用是判斷兩個字串是否相同,核心思想是……

各大oj的字串題目:

1、hdu2222 keywords search

建出ac自動機後,在ac自動機上暴力跑,每跑到乙個節點就暴力去更新所有fail節點的答案就好了,暴力可過。

2、hdu2896 病毒侵襲

同上題,建出ac自動機後,暴力跑fail指標。

3、hdu3065病毒侵襲持續中

同上題,建出ac自動機後,暴力跑fail指標。

4、poj2778 dna sequence

建出ac自動機後dp,dp[i][j]表示長度為i匹配到j節點的方案數,轉移非常簡單,非常裸的矩陣優化。

5、hdu2243 

考研路茫茫――單詞情結

同上,dp的時候記錄加一位求和的矩陣即可。

6、hdu2825 wireless password

狀壓dp,dp[s][i][j]表示當前集合為s,匹配到第j個節點,長度為i的方案數,暴力轉移。

7、hdu2296 

ring

dp,f[i][j]表示長度為i,匹配到j節點的最大分數,記錄一下由**轉移,字典序最小處理一下就可以了。

8、hdu2457 dna repair

dp,f[i][j]表示長度為i,匹配到j節點最少改變多少個字元。

9、hdu3341 lost's revenge

dp,懶得寫了,注意要壓縮狀態。

10、zoj3494 bcd code

數字dp+ac自動機,處理出bcd[i][j]表示i節點加上乙個j轉移到哪個節點,然後就是數字dp了,我是分開處理的,分別處理剛好長度為n的和長度不到n的,長度為n的分成卡住和不卡兩種,長度不到n的直接轉移即可,比較好理解。

11、poj1743 musical theme

求變化趨勢肯定要先差分,然後判斷是否有兩段相同,那麼二分答案,對height分組,那麼答案的兩個字串一定在同乙個組內,維護乙個出現端點的最小值判斷是否重疊即可。

12、poj1816wild words

帶有萬用字元的匹配,這道題比較簡單,對所有串建乙個trie樹,之後在trie樹上dfs,注意*可以停留在原地,別寫成死迴圈了。

13、poj2752 milking grid

kmp,求乙個最小矩陣迴圈後能覆蓋整個矩陣,類似一維,先對每一行求乙個kmp,之後求出週期的lcm即為矩陣的列數,行數同理。

14、poj2774 long long message

字尾自動機,先對串a建字尾自動機,用串b在串a的自動機上匹配,記錄每個位置匹配到的最長的長度,最後取最大即可。

15、poj3376 finding palindromes

考慮兩個串可以合併的條件,乙個串是另乙個串翻轉後的字首,並且剩下的那一部分回文,那麼我們首先用manacher處理出每個串的哪些位置可以作為結尾,然後對所有字串建一棵trie樹,用每個翻轉後的字串在trie樹上匹配,途中記錄下當前位置的對應的節點是否可以合併,最後在看一看該串能否作為短串進行合併。

16、poj3415 

common substrings

字尾自動機,用原串在自動機上匹配,當當前狀態匹配長度》=k的話,就記錄答案,同時因為fa節點也被匹配到了,所以可以在fa節點上打上乙個標記,記錄被匹配到了多少次,最後一起統計。

17、poj3208 apocalypse someday

ac自動機上的dp,非常簡單。

18、poj3261 milk patterns

字尾陣列,二分答案後對height分組即可。

19、poj3294 life forms

先二分答案,對height陣列分組後,處理出哪些位置可行,之後按照sa的順序列舉就可以了。

20、poj3576 language recognition

先建出trie樹,考慮什麼時候兩個節點可以合併,那就是兩個節點的子樹資訊完全相同時,那麼就進行一次子樹hash就可以了。

21、poj3581 

sequence

先倒過來求出sa陣列,第一次肯定交換sa[1]就好了,第二次把原來的串在後面複製一次求一遍sa,此時的sa[1]就好了,這裡要特判是否後面留了字尾的位置,即sa[1]>2等等,第二次還要判斷是否不在複製的串中。

22、poj3693 maximum repetition substring

最麻煩的字尾陣列,列舉長度後這個串一定經過s[1]、s[1+l]、s[1+2l]……,所以求一下這些地方的lcp,對l取模後向前平移若干個位置,若lcp變成l的整數倍,說明最佳位置在這,處理出所有位置後,按照sa列舉順序。

23、hdu2471 history of languages

首先把所有到達不了單詞的邊全部刪掉,之後dfs即可。

24、hdu3901 wildcard

帶有萬用字元的匹配,用ac自動機來做,原諒我講不了,還是到網上看題解吧。

25、bzoj1009 gt考試

kmp,dp[i][j]表示長度為i匹配到j的位置的方案數,暴力轉移,裸的矩陣優化。

26、bzoj1030 文字生成器

補集轉化,變成乙個都不出現,就轉化成了上面的ac自動機+dp了。

27、bzoj1031 字元加密

複製一遍後放在原字串的後面,求一遍sa,按照sa做就好了。

28、bzoj3530 數數

數字dp+ac自動機,算了我也不想說了,很裸的。

29、bzoj3670 動物園

kmp求出pre陣列,暴力的往前跳直到跳到長度小於i/2為止。

未完待續

字串專題

created on 2019年12月1日 author hp 擷取字串 str2 我是迪迦奧特曼 str3 str2 5 str4 str2 0 len str2 2 print str3,str4 擷取的字串如果不存在,會出現異常,可以用try.except捕捉異常 try str5 str2 ...

字串專題

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。示例1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 解釋 6個回文子串 a a a aa aa aaa 解法 1 動態...

字串專題

1.double ceil double x 求大於 x 的最小的數,即向上取整函式 includeusing namespace std intmain 2.a 65 z 90 a 97 z 122 3.字串刪除 c 從string中刪除所有的某個特定字元 超好 includeusing name...