附模板(字尾陣列)
void build_sa(int m,int n){
int *x=wa,*y=wb,*t;
for(int i=0;i=0;i--)sa[--c[x[i]]]=i;
for(int k=1;k<=n;k<<=1){
int p=0;
for(int i=n-k;i=k)y[p++]=sa[i]-k;
for(int i=0;i=0;i--)sa[--c[x[y[i]]]]=y[i];
t=x;x=y;y=t;
p=1;
x[sa[0]]=0;
for(int i=1;i
int dp[maxn][18];
void init_rmq(int n,int h)
{ for(int i=1;i
字尾陣列
sa[i] 表示排名為i的字尾sa[i];
rank[i] 表示字尾i排名rank[i];
height[i]表示相鄰排名的字尾的公共字首長度。
題目總結:
hdu 1403 longest common substring
求兩個串的最長公共子串長度。
解法:把兩個串接起來,拼成乙個串,擁有最長公共子串的兩個字尾必定排名是相鄰的。
判斷兩個字尾是否分別屬於兩個串即可。
poj 1703 musical theme
給定乙個序列,問重複趨勢相同的最長子串長度。
用後面減前面的,就可以得到趨勢字串。
同上面一題。
poj 3261 milk patterns
求可重疊最長k重複子串。
解法:二分答案,用mid值對height陣列進行分組,使得同一分組的相同字首均大於mid。分組內的字尾大於k,即為符合條件。
poj 3294 life forms
給定n個字串,求最長的子串,且這個子串出現在一半以上(超過一半)的字串中。
解法:連線字串,二分答案,height分組,判斷每組是否包含出現超過一半字串的字尾。
判斷的同時記錄下符合條件的字尾。
hdu 3518 boring counting
求最長不重疊至少出現了兩次的子串數量。
解法:列舉長度len,找符合條件的子串(字尾差大於長度即為不重疊)。
hdu 4622 reincarnation
求[l,r]區間內的不同子串數量。
解法: 和統計子串數量差不多,只不過再詢問時加了乙個遞推的優化。
hdu 4436 str2int
求多個串的不同子串不同權值和。
解法:依然是統計子串,加了乙個權值字首和的預處理。
hdu 2459 maximum repetition substring
求重複數最大且字典序最小的子串。
列舉重複串l的長度,計算相鄰l的最長公共字首k。因為有可能不是正好從l開始,
所以嘗試著向前找l-k%l。如果符合,次數加1,繼續向前暴力字典序。
字尾陣列總結
2子串個數問題 3迴圈子串問題 兩個字串串問題 2子串個數問題 多個字串問題總結 首先,使用倍增演算法求出對應sa,height值,時間複雜度o nlog n 具體定義參考國家集訓隊2009羅穗騫 中還給出一種線性dc3做法 include using namespace std const int...
字尾陣列題目總結
入門部落格 p3809 模板 字尾排序 p4051 jsoi2007 字元加密 將字串s複製為ss,做字尾陣列。p2870 usaco07dec best cow line g 題意 給出乙個字串,每次可以從字串的首位取出乙個字元,放到佇列的尾部,求可以得到的最小的字典序是多少?思路 pre i 表...
SA 字尾陣列 專題總結
曾經一度以為sa是大神知識點來著 後來才發現其實是澤州哥哥講得太深奧了我等蒟蒻不能參透 理解了之後題還是可以做的 因為大多數都不是在sa上做文章而是與其他知識點結合 迪哥講 sa 和 sam 鈦聚啦 放例題算是sa的板子題了吧 求出每個點能控制的區間,單調棧 二分都行,直接統計就行了 sa乙個套路就...