字串彙總

2022-10-11 17:48:12 字數 2302 閱讀 8719

字串的暴力,挺無腦的,沒什麼想說的。

inline void init()

inline int query(int l,int r)

第一次是橫著hash,用的是p1,此時的 \(h_\) 表示的是第 \(i\) 行長度為 \(j\) 的字首串的hash值。

第二次是豎著hash,用的是p2,此時的 $h_ $ 發生了更新,此時的 \(h_\) 變成了 \((1,1) \to (i-1,j)的矩陣的hash值 \times p2 +\) 第 \(i\) 行長度為 \(j\) 的字首串的hash值,表示的是(1,1)到(i,j)矩陣的hash值。

然後求乙個子矩陣的hash值時,比如子矩陣的右下角座標為(i,j),行數為n,列數為m,則子矩陣的hash值為 \(hash_-hash_ \cdot p1^n-hash_*p2^m+hash_ \cdot p1^n \cdot p2^m\).(這個和二維字首和有點類似)。

fep(i,1,n) fep(j,1,m) h1[i][j]=(h1[i][j-1]*p1%mod+mp[i][j])%mod;

fep(i,1,n) fep(j,1,m) h1[i][j]=(h1[i-1][j]*p2%mod+h1[i][j])%mod;

fep(i,a,n) fep(j,b,m) vis1[((h1[i][j]-h1[i-a][j]*qpow2[a]%mod-h1[i][j-b]*qpow1[b]%mod+h1[i-a][j-b]*qpow1[b]%mod*qpow2[a]%mod)%mod+mod)%mod]=1;

定義:\(0 \to i-1\) 的最長字首字尾(字首字尾相等且長度最大)。

更新:\(0 \to i\) 的最長字首字尾一定是從 \(0 \to i-1\) 的某個字首字尾轉移得來,所以只需要不停的訪問字首字尾直到匹配成功或者失敗。

inline void init(int n)

\),子串為 \(s_-1}\)。

如果len可以被 \(len - nxt_\)整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t=len/l。

如果不能,說明還需要再新增幾個字母才能補全。需要補的個數是迴圈個數\(l-len~mod~l=l-(len-l)~mod~l=l-nxt_~mod~l\),$ l=len-nxt_$。

隔一會

\(sa_i\) :表示將所有字尾排序後第 \(i\) 小的字尾的編號, \(rk_i\) :表示字尾 \(i\) 的排名。

假設已經處理好了字串 \(s_1 \to s_k,s_2 \to s_...s_ \to s_n s_ \to s_n... s_n\) 的 \(rk_i\)(此時的定義為 \(s_i \to s_\))

考慮倍增已經處理的長度,令 \(len=k \cdot 2\)

排名為 \(x_i\) 的字串加上排名為 \(y_i\) 來更新 新的 \(rk\)。

其中 \(x_i\) 為第一關鍵字, \(y_i\) 為第二關鍵字。

\(s_1 \to s_,s_2 \to s_...\)的 \(rk_i\) 就是在 \(s_1 \to s_...\) 的基礎上(第一關鍵字)按 \(s_ \to s_...\) (第二關鍵字)再次排序。

最後形成的 \(rk_i\) 就是字尾的排名。(感覺有點分治,或者是區間dp,先處理小的區間,在用小區間的值去更新大區間。)

times陣列1

2345

678s

aaba

aaab

1rk11

2111

12x,y1,1

1,22,1

1,11,1

1,11,2

2,02rk1

2411

123x,y

1,22,4

4,11,1

1,11,2

2,33,0

(來自 oi_wiki。(有答案。))

inline void get_sa()

}

lcp:最長公共字首, \(lcp(i,j)\) 表示字尾 \(i,j\) 的最長公共字首。

\(height_i:lcp(sa_i,sa_)\) 其中 \(height_1=1\)。

\(height_ \geq height_-1\)

\(lcp(sa_i,sa_j)=min(height_...height_j)\)

inline void get_lcp()

}

字串方法彙總

1.定義字串直接量 var s abc 2.構造字串 var s new string 建立空字串 var s new string adafwv 字串初始化 3.計算字串長度s.length 注意 字串長度不可以像陣列一樣動態增長,但可使用下標來定義單個字元 4.查詢字串 charat 返回字串中...

字串函式彙總

為什麼strcpy要有返回值?返回strdest的原始值使函式能夠支援鏈式表示式,增加了函式的 附加值 同樣功能的函式,如果能合理地提高的可用性,自然就更加理想。鏈式表示式的形式如 int ilength strlen strcpy stra,strb 又如 char stra strcpy new...

LeetCode 字串彙總

反轉和回文 這一型別題都是對每一位的數相加,然後餘數是相加得到的結果,商是進製 不夠的補零 class solution if cd 1 reverse ans.begin ans.end return ans 給定兩個二進位制字串,返回他們的和 用二進位制表示 輸入為非空字串且只包含數字 1 和 ...