求單個子串的不重複字串的個數 (t<=20,len<=1000)這是一道經典的字尾陣列入門題。
由於剛開始學,對字尾陣列的理解還很抽象,於是拿這道題先找找感覺。
首先,每個子串都可以理解成是某個字尾的字首,這是聯想到字尾陣列演算法的重要一步。
接著,對於每乙個sa[i]字尾陣列,含義為第i小的字尾的起始位置是sa[i],那麼它最多能得到字串個數為:n-sa[i]。
對於每乙個height[i]陣列,即lcp(i-1,i),的含義為第i小的字尾與第i-1小的字尾的最長公共字首。那麼重複的子串個數為:height[i],實際產生的子串個數為:n-sa[i]-height[i]。
貼一發kuangbin大大的模板
void build_sa(int s,int n,int m)
}void getheight(int s,int n)
}
SPOJ 694不同子串個數
求乙個字串的不同子串個數。字尾陣列求出sa和height 每 乙個 字尾sa i 貢 獻n 1 sa i 個前 綴,減去 heig ht i 就是和 前乙個後 綴相同的 字首個數 累加就 是答 案每乙個字尾sa i 貢獻n 1 sa i 個字首,減去height i 就是和前乙個字尾相同的字首個數,...
spoj 694 不相同的子串的個數
字尾陣列 處理字串的有力工具 題目大意 要求求乙個字串中不同子串的個數 解題思路 利用字尾陣列,每個子串一定是某個字尾子串的字首,求多少個不同的子串等價於求出所有字尾之間的不相同的字首的個數。設字串為str,sa i 表示排名第i的字尾從str的第sa i 個位置開始,rank i 表示str i ...
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...