距離GDOI 131天 字尾陣列完畢

2022-03-30 20:42:57 字數 1490 閱讀 5784

用了近兩周的時間,終於把羅神那篇字尾陣列應用看完了,題目也寫了一遍,t了無數次...詳見前幾篇博文...

字尾陣列很重要的是那個height陣列,可以用來做各種奇奇怪怪的東西...常用方法去是去二分,比較少見的是單調棧維護...明天把切的12道題題型整理歸納後再補在後面吧,有點晚了...明天覆習ac自動機去!

預備:最長公共字首

對於suffix(i)和suffix(j) 假設rank[i]

一、分組+二分長度:

1.不可重疊最長重複子串 (poj1743)

二分長度k,將heigh[i]>=k的分為一組..然後對於這組字尾,我們記錄其sa[i]的最大值和最小值,若最大值與最小值之差不小於k,那麼長度k成立..

2.可重疊的 k 次最長重複子串(poj3261)

同上一道題,二分長度,判斷一組的字尾個數不少於k即可..

3.不小於 k 個字串中的最長子串(poj3294)

二分長度,分組。分組中判斷k個:將字串染色,然後用布林陣列判斷是否出現在多個字串即可...

4.每個字串至少出現兩次且不重疊的最長子串(spoj220)

依舊二分長度,分組。對於一組字尾,長度為len,我們判斷是否滿足每乙個字串都有出現兩次,且兩次出現的sa[i]>=len..所以記錄每個串的最小值和最大值即可...

5.出現或反轉後出現在每個字串中的最長子串(poj1226)

和1的做法差不多..染色的時候把反轉後的字串染成一樣的就行..

二、暴力列舉:

1.可重疊最長重複子串

子串出現2次或以上,也就是找到最大的height值即可..

2.不相同的子串的個數(spoj694,spoj705)

每個子串一定是某個字尾的字首,那麼原問題等價於求所有字尾之間的不相同的字首的個數...然後對於suffix(sa[i]),將產生n-sa[i]+1個字首,用height陣列去重即可..

3.最長回文子串(ural 1297)

分長度為奇數和偶數...將原串翻轉後扔在後面,中間插乙個辨別字元,一般用比所有字元小的字元..

列舉每個字母作為回文串中心:

(1)奇數:最長回文串為lcp(i,len-i+1)*2-1

(2)偶數:最長回文串為lcp(i,len-i+2)*2 (i=1時不成立)

4.連續重複子串(poj2406)

列舉k,判斷lcp(1,k+1)是否等於n-k...預處理一下達到o(1)查詢即可..

5.最長公共子串(poj2774,ural 1517)

列舉height[i],判斷sa[i],sa[i-1]是否不屬於同乙個字串,不屬於則height[i]可計入答案..

三、有技巧的列舉、單調棧

1.重複次數最多的連續重複子串(spoj687 poj3693)

詳見:2.長度不小於 k 的公共子串的個數 (poj3415)

單調棧o(n)維護...詳見:

10000天後的日子。。

01 02.程式的版權和版本宣告部分 05.檔名稱 test.cpp 06.作 者 王雅萍 07.完成日期 2014年 3 月 18 日 08.版 本 號 v1.0 09.對任務及求解方法的描述部分 10.輸入描述 無 11.問題描述 12.程式輸出 輸出好幾個小的結果 13.問題分析 略 14.演...

100天後的日期是多少

開始進入it行業的時候面試官問過我乙個問題 假設今天是2012年1月1日,7天後是多少,100天呢,1萬天呢,當時沒有回答好.當時我的思路 首先想到的是天數很大,然後需要我怎麼處理 1.看天數days是否大於365,是的話算經過了 days 365 年需要多少天n,得到了還需要增加 days n 天...

oj 計算一萬天後的日期

刷oj題時的筆記 輸入日期,要求輸出一萬天以後的日期。輸入輸入有多行,格式為yy mm dd 其中1949 yy 2006,日期絕對合法。輸出輸出有多行。即ccc老師生日第一萬天以後的日期,格式為 y m d include 計算一萬天以後的日期 2019 6 7 判斷是不是閏年 bool func...