一些字符串(水)題

晚上不想寫代碼,就水一發博客吧qwq。

P2444 [POI2000]病毒

鏈接
無限長的字符串就是能在ACAMACAM上無限跑下去而不會撞到已有的字符串,所以建出ACAMACAM判環即可。

P3763 [TJOI2017]DNA

鏈接
建出SAMSAM之後,由於可以有錯誤匹配的機會,所以我們可以考慮dpdp。令dp[i][j]dp[i][j]表示匹配到ii這個節點時錯誤了jj次匹配是否可行,當然,寫個記憶化搜索就好了。

P3966 [TJOI2013]單詞

鏈接
ACAMACAM板題……不過我還是一眼看成SAMSAM……
把所有字符串拼在一起,兩兩之間新增一個其它字符,然後把這個大字符串插到SAMSAM裏,最後把每個串往上跑就好了。由於每個串都存在,所以連parentparent樹都不用跳,好寫的一批。

P4051 [JSOI2007]字符加密

鏈接
SASA定義
不過我很好奇,SASA0909年的論文,0707年他們是怎麼做的?

P4094 [HEOI2016/TJOI2016]字符串

鏈接
這個問題轉化還是比較妙的
首先可以明確,[a,b][a,b]中所有子串有意義的其實只有以bb爲右端點的那些後綴,所以一種暴力的做法就是枚舉左端點再和[c,d][c,d]lcplcp。對此,我們可以二分答案,顯然如果maxlcp=xmaxlcp=x的話,任意小於xxlcplcp都是可以取到的(一起刪去末尾不就好了)。
接下來,我們就把原問題轉化成了一個判定性問題:判斷[a,bmid+1][a,b-mid+1]爲左端點,b爲右端點的子串與[c,d][c,d]的子串是否有lcplcp大於等於midmid的。這樣的話,我們可以在SASA中找到與[c,d][c,d]lcplcp大於等於midmid的所有串(暫且叫做salrsa_{l…r}),那麼接下來的問題就是詢問i[a,bmid+1]i∈[a,b-mid+1]rnki[l,r]rnk_i∈[l,r]ii是否存在。把ii看做下標,rnkirnk_i看做權值,這就是主席樹板子了。

P5108 仰望半月的夜空

鏈接
考慮貪心,對於長度爲ii的子串,我們必然要在SASA上找到第一個長度大於等於ii的子串,這個串的前ii位必然是長度爲ii的子串中字典序最小的。在這個基礎上,由於位置也要滿足最小,那麼就是與上述的這個串的lcplcp大於等於iisasa最小的。我們枚舉ii,由於ii單調遞增,那麼上述那個串的位置也必然是單調不降的,複雜度就有保證了。

P4036 [JSOI2008]火星人

鏈接
帶插入修改的lcplcp……考慮lcplcp除了可以SASA,也可以用二分+哈希。對此,我們建一顆SplaySplay出來,每個點維護子樹內的HashHash值,對於詢問lcplcp,二分之後在SplaySplay對應區間判斷HashHash是否相等就好了。

未完待續……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章