字串專題算是搞得差不多了,來大概總結一下吧。
要掌握的演算法: 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...