spoj687(字尾陣列)

2021-09-09 03:02:26 字數 742 閱讀 8934

題意:給一串字元,需要你求這一串字元中有連續重複的字元的重複次數.......

思路:這是和poj3693一種型別的題目......這裡是詳細解答:

注意:還需注意的地方,我一直圖方便,再求lcp值時,總是從height值的起點到終點,其實應該是起點+1

#include#include#includeusing namespace std;

#define min(x,y) x>y? y:x

#define maxn 51000

int wa[maxn],wv[maxn],sa[maxn],rank[maxn],height[maxn],wb[maxn],wsf[maxn];

int s[maxn],dp[maxn][40];

int cmp(int *r,int a,int b,int k)

void getsa(int *r,int *sa,int n,int m)

ll++; //注意,ll要++

int k=0;

while((1<<(k+1))<=rr-ll+1) k++;

return min(dp[ll][k],dp[rr-(1=0&&s[m]==s[m+i];m--)

}if(ansans=d;

}} printf("%d\n",ans);

} return 0;

}

SPOJ 687 REPEATS(字尾陣列)

題意 求重複次數最多的連續重複子串的長度 題解 一樣的思路,列舉重複長度為l,就有rk pos rk pos rk pos 和rk p os l rk pos l rk pos l 這兩個串,pos為列舉的l的倍數,即rk k l rk k l rk k l 和rk k 1 l rk k 1 l r...

字尾陣列 RMQ SPOJ 687

題意 問給出的串中連續重複的子串的最長的長度 思路 先將字尾陣列和高度陣列先求出來,分別為sa和lcp陣列。然後用rmq的st演算法將從位置i和j開始的字尾的最長公共字首求出來,這個還好理解把,對與排名第一的字尾,它的高度陣列為與排名第二的字尾的最長公共字首,依次類推,比如到第四個,前四個分別為5,...

spoj 694 705 字尾陣列

每個子串一定是某個字尾的字首,那麼原問題等價於求所有字尾之間的不相同的字首的個數。如果所有的字尾按照 suffix sa 1 suffix sa 2 suffix sa 3 suffix sa n 的順序計算,不難發現,對於每一次新加進來的字尾 suffix sa k 它將產生 n sa k 1 個...