解題思路:字尾陣列的寫法一開始看有些匪夷所思,花了我半天時間才解析完,理解內涵。
關於height,詳見我的另一篇字尾陣列分組中的部落格。
也推薦幾篇:**解析)
原理講解)
原理講解)
題意: 給出兩個字串, 求他們的最長公共子串
字尾陣列建立字尾優先順序的複雜度為o(nlogn),n為字串的長度。用height求解的複雜度大致為o(n),所以總的複雜度是o(nlogn)。用字尾陣列求公共子串是乙個典型用法。
再補充很重要的一點,要在原來字串後面加入乙個比任何字元都要小的字元。所以直接幅值acsii為0的。至於為什麼要+0,下面這篇**做出了解釋
大概的原因就是 當y[sa[i-1]] == y[sa[i]] 時,說明y[sa[i-1]] 和y[sa[i]]中都不包括y[n-1](因為y[n-1]比誰都小,獨一無二),這樣 y[sa[i-1]+k] 和y[sa[i]+k]就肯定不會越界,前面已經說明,不包括則距離邊界一定差k以上。
#include#include#include#define n 200005
using namespace std;
char s[n];
int sa[n],t1[n],t2[n],c[n],rnk[n],height[n],n;
void build_sa(int m) }
void getheight()
j = sa[rnk[i]-1];
while(s[i+k] == s[j+k]) k++;
height[rnk[i]] = k; }}
int main()
} printf("%d\n",ans);
} return 0;
}
hdu1403 字尾陣列模板
題意 給出兩個字串,求他們的最長公共子串 思路 兩個字串的最長公共子串長度顯然就是兩個字串的所有字尾中的最長公共字首長度.可以先用乙個沒有出現的字元 便於後面區分字尾是否屬於相同字串 將兩個字串連成乙個字串,再用字尾陣列求其height,sa陣列,對於當前 i,通過 sa 陣列區分字尾 i 和 i ...
hdu1403 字尾陣列入門題
1403 思路 字串的任何乙個子串都是這個字串的某個字尾的字首,則求a和b的最長公共子串等價於求a的字尾和b的字尾的最長公共字首的最大值。做法 將第二個字串寫在第乙個字串後面,中間用乙個沒有出現過的字元隔開,再求這個新的字串的字尾陣列。1 include bits stdc h 2 using na...
HDU 1403 字尾陣列初步
題意 求兩個串的最長公共子串 兩個串連線起來然後求高度陣列 注意兩個sa值必須分別在不同一側 本題是用來測試模板的,回想起青島那次翻車感覺很糟糕 include include include include include include include include include inclu...