一直以來字串和數論都是我的弱項,是時候從字串開始改善一下了。
然而有些題目並不會寫**,只是給個一句話題解。
字尾陣列,lcp轉換為求區間min。
分別統計a到b、b到a的貢獻,單調棧搞一搞。
位置重合時特殊處理。
隨便用什麼資料結構統計每個串出現的位置,然後暴力做。
由於保證詢問字串互不相同,可以一波分析複雜度發現是\(o(n\sqrt)\)。
沒意思,不寫。
固定左右端點時長度不滿足單調性,很不舒服。
但是可以發現固定中點時向左右擴充套件,此時具有單調性,可以二分+雜湊判相等。
沒什麼**難度,不寫。
如果沒有本質不同的要求可以字首和+st表隨便搞。
加上本質不同的要求後可以用字尾陣列給每個左端點乙個右端點的限制,就做完了。
氧化鈣。
\(o(n^2)\)的暴力能過,那還做個鬼啊。
兩個互不相關的字串雜在一起非常不爽,設s=ab,那麼合法的串就會長得像sss……ssa的樣子,其中a是s的字首。
那麼可以列舉s的長度,二分a的長度,雜湊即可。
顯然,要得到答案,必然要使lcp最長,然後最後乙個字元略大。
那麼可以建出sam,把串丟上去看看最長lcp有多少,然後從大往小列舉。
但是有乙個\([l,r]\)的限制,就需要維護每個節點所對應的那些串在**出現過。
於是可以維護一下endpos集合,用線段樹合併即可。
就是一道sb題,我竟然搞了2個小時……
按照往左的括號多還是往右的多,分類討論。
用字尾陣列排序一下,列舉從**斷開,判一下是否合法,若合法直接輸出就好了。
第一反應倍增+雜湊,不過似乎並不能過(網上沒有題解)
題解寫的是樹剖+字尾陣列,好像也很有道理。
由於太裸,**就咕咕咕了……
套路題。
首先思考只有乙個\(l\)的時候怎麼做,顯然可以用字尾陣列的height陣列處理出合法區間然後計算。
多個\(l\)時按照套路,用並查集。按height陣列排序,從大到小插入,相當於合併兩個區間,亂搞一通即可。
顯然可以轉換為能被模式串完全覆蓋的串的數量。
很容易想到逐位dp,記錄當前長度、未匹配長度和最後幾位的狀態。關鍵在於如何記錄狀態。
發現ac自動機很完美地搞定了這一任務,於是就做完了。
注意以每個節點結尾的串的最大長度要考慮到fail。(應該只是我ac自動機不熟練才會犯這樣的錯誤)
套路題。
很容易想到差分,然後取相反數複製一遍。
然而有個不能重疊的麻煩條件,就還要套個主席樹。
顯然可以dp。x那麼小,把它丟到狀態裡,就ok了。
一開始寫了個逐位dp,不知怎麼wa掉了,改成字尾陣列每次匹配lcp就過了。
非常顯然的思路是列舉每乙個位置為開頭,看往右能延伸多少。延伸的長度顯然可以二分。
然後建出字尾陣列,用height陣列二分出滿足條件的區間。
最後用主席樹維護一下區間屬於不同的串的個數即可。
略碼農,但細節不多。
簡單一些的題也做了不少了,接下來可能會更傾向於做難題,然後發一整篇部落格。
更新速度會降低,但(希望)題目質量會提高,至少模板題不會再有了。
update:由於博主太懶,而且現在見到字串就想吐,可能會過很久才寫。現在先去搞數論了。
字串專題
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...