大概的思想就是對於乙個重複長度為l的串,對於下表0,l,2*l,3*l。。。存在相鄰兩個數使得r[i]==r[j],這樣對於i,j匹配得到的最長公共字首得出重複次數z/l+1,但如果不整除的話,
i和j要前移l-z%l,原因很明顯,畫個圖就ok了,然後對於字典序,只需要外層列舉sa陣列的下表,內層列舉所有使得有maxnumber的重複長度l,看是否滿足,滿足就輸出然後break
即可#include#includeconst int maxn=100010;
int sa[maxn],wa[maxn],wb[maxn],ws[maxn],n,r[maxn],height[maxn],rank[maxn],rmq[maxn][20],f[maxn],b[maxn];
char str[maxn];
inline int min(int a,int b)
int cmp(int *r,int a,int b,int l)
void da(int *r,int *sa,int n,int m)
return cnt;
}int ask(int i,int j)
i++;
int t=get(j-i+1);
return min(rmq[i][t],rmq[j-(1<=n)continue;
int z=ask(rank[x],rank[x+b[j]]);
if(z>=(ans-1)*b[j])
{ff=0;
for(k=x;k
字尾陣列 poj 3693
題目 給出乙個串,求重複次數最多的連續重複子串 列舉長度為l,然後看長度為l的字串最多連續出現幾次。既然長度為l的串重複出現,那麼str 0 str l str 2 l 中肯定有兩個連續的出現在字串中。那麼就列舉連續的兩個,然後從這兩個字元前後匹配,看最多能匹配多遠。即以str i l str i ...
poj3693 字尾陣列
題意 給出一串字元,需要求這串字元中的最長重複子串,要是有多個,輸出字典序最小的.我自己的一些想法 這個思路我一開始倒是沒有看明白,慢慢的編下去,才懂了它到底是如何操作的.其實就是列舉多少個字元會匹配,然後求出它們的height值,再用這個值去除以長度,得到有多少個迴圈.具體看 include in...
POJ 3693 字尾陣列
題意 首先定義了乙個字串的重複度。即乙個字串由乙個子串重複k次構成。那麼最大的k即是該字串的重複度。現在給定乙個長度為n的字串,求最大重複次數的子串,有多解時輸出字典序最小解。思路 與spoj的題意差不多,可以點選這裡看 說下字典序的問題,想記錄size 最大重複次數,把所有滿足條件的長度l都記錄起...