題意:給一串字元,需要你求這一串字元中有連續重複的字元的重複次數.......
思路:這是和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 個...