spoj 694 705 字尾陣列

2021-06-05 04:45:18 字數 576 閱讀 3278

每個子串一定是某個字尾的字首,那麼原問題等價於求所有字尾之間的不相同的字首的個數。如果所有的字尾按照 suffix(sa[1]), suffix(sa[2]),suffix(sa[3]), …… ,suffix(sa[n])的順序計算,不難發現,對於每一次新加進來的字尾 suffix(sa[k]),它將產生 n-sa[k]+1 個新的字首。但是其中有height[k]個是和前面的字串的字首是相同的。所以 suffix(sa[k])將「貢獻」出 n-sa[k]+1- height[k]個不同的子串。累加後便是原問題的答案。這個做法的時間複雜度為 o(n)

#include#includeusing namespace std;

const int maxn=1010;

int a[maxn],b[maxn],s[maxn],c[maxn];

int *rank,*height,*sa=s+1;

void sortandrank(int *a1,int *a2,int n,int &m,int j)

rank=a1,height=a2;

}void calheight(char*str,int n)

cout<

SPOJ 220 字尾陣列

簡略題意 每個字串中至少出現兩次,且不重疊的最長子串先將n 個字串連線起來,二分答案t,用 t 分組之後看同一組的是否出現在所有串中至少兩次,且在每個原串中的最大最小sa i sa j k。其實只要同時存在最大最小位置,即出現了至少兩次。include include include include...

spoj687(字尾陣列)

題意 給一串字元,需要你求這一串字元中有連續重複的字元的重複次數.思路 這是和poj3693一種型別的題目.這裡是詳細解答 注意 還需注意的地方,我一直圖方便,再求lcp值時,總是從height值的起點到終點,其實應該是起點 1 include include includeusing namesp...

字尾陣列入門 SPOJ694

求單個子串的不重複字串的個數 t 20,len 1000 這是一道經典的字尾陣列入門題。由於剛開始學,對字尾陣列的理解還很抽象,於是拿這道題先找找感覺。首先,每個子串都可以理解成是某個字尾的字首,這是聯想到字尾陣列演算法的重要一步。接著,對於每乙個sa i 字尾陣列,含義為第i小的字尾的起始位置是s...