傳送門
回來複習一下字尾陣列,感覺之前不理解的地方突然都能理解了 >w<。
說實話字尾陣列比字尾自動機簡單。
這道題要求本質不同的子串數量,可以模擬字尾自動機的方法,字尾i貢獻的數量就是i的長度-height[rank[i]],因為之前那幾個字首和某乙個字尾的字首重複了。
#include using namespace std;
const int n=1e5+10;
char s[n];
int n,m,sa[n*2],rk[n*2],c[n],tp[n*2],ht[n*2],ans;
void getsa()
//根據height陣列的性質可以o(n)的求,即 ht[rk[i]]>=ht[rk[i-1]]-1
//很好證明,設字尾i-1與k的lcp=len,那麼字尾i至少與字尾k+1有lcp=len-1,
//因為這兩個字尾都是從前面那個字尾上扣了乙個字母下去嘛
int k=0;
for(int i=1;i<=n;i++)
ans=0;
for(int i=1;i<=n;i++) ans+=n-i+1-ht[rk[i]];
printf("%d\n",ans);
}void solve()
int main()
SP694 字尾陣列
求乙個字串本質不同的子串 考慮容斥 因為每乙個子串應該都是原串的乙個字尾的字首。因此重複的子串的總數應該就是所有字尾的hei gh theight height 陣列的和。a ns n n 1 2 i 1n heig ht i ans n n 1 2 sum height i ans n n 1 2...
洛谷P3181 字尾陣列
題目要求求出兩個兩個字串中相同子串的方案數,那麼我們將其拼接起來,去求出拼接後的字串中含有相同子串的數量。當然這樣做會求出同乙個字串中相同子串的數量,所以我們還需要如法炮製分別求出兩個字串中的答案,然後用總貢獻減去他們。那麼問題就變成了如何求出乙個字串中相同子串的數量。實際上這就是求任意兩個字尾x,...
洛谷 P3809 模板 字尾排序 字尾陣列
題目描述 讀入乙個長度為 n n 的由大小寫英文本母或數字組成的字串,請把這個字串的所有非空字尾按字典序從小到大排序,然後按順序輸出字尾的第乙個字元在原串中的位置。位置編號為 1 1 到 n n 輸入輸出格式 輸入格式 一行乙個長度為 n n 的僅包含大小寫英文本母或數字的字串。輸出格式 一行,共n...