字尾陣列(不可重疊最長重複子串)

2021-07-25 09:27:44 字數 1258 閱讀 6816

poj 1743

二分答案,把題目變成判定性問題:判斷是否

存在兩個長度為k的子串是相同的,且不重疊。解決這個問題的關鍵還是利用

height陣列。把排序後的字尾分成若干組,其中每組的字尾之間的height值都

不小於k。

有希望成為最長公共字首不小於k的兩個字尾一定在同一組。然

後對於每組字尾,只須判斷每個字尾的sa值的最大值和最小值之差是否不小於

k。如果有一組滿足,則說明存在,否則不存在。

#include//sa為字尾陣列,把字尾從小到大排序把字尾開頭存起來,rank為名次陣列,以i開頭的字尾在所有字尾中排第幾

#include

#include

#include

#include

#define f(x) ((x)/3+((x)%3==1?0:tb))

#define g(x) ((x)using

namespace

std;

const

int maxn=1e6+10;

int wa[maxn],wb[maxn],ww[maxn],wv[maxn],n;

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

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

return ;

}int h[maxn];//也就是排名相鄰的兩個字尾的最長公共字首sa[i]和sa[i-1]

int rank[maxn];//名次陣列

void get_height(int *r,int *sa,int n)

int a[maxn];

int sa[maxn],r[maxn];

int judge(int mid)

if(mx-mn>=mid)//如果不重複返回1

return

1; }

return0;}

int main()

n--;

a[n]=0;

da(a,sa,n+1,180);

get_height(a,sa,n);

int l=0;

int r=n-1;

while(l<=r)//二分列舉長度

int ans=r;

if(ans>=4)

printf("%d\n",ans+1);

else

printf("0\n");

}}

字尾陣列練習1 不可重疊最長重複子串

這道題在之前,一定要先看一下我之前在字尾陣列部落格裡面提到的最長公共字首 poj1743 時間限制 2 sec 記憶體限制 128 mb 提交 207 解決 81 提交 狀態 討論版 命題人 admin 題目描述 然後如果你了解了最長公共字首,那麼我們就提一下這道題和最長公共字首有什麼大關係 求字串...

最長重複子串(可重疊) 字尾陣列

找了半天終於找到乙個可以提交的地方。題解 任何乙個重複子串,都必然是某兩個字尾的最長公共字首。因為,兩個字尾的公共字首,它出現在這兩個字尾中,並且起始位置時不同的,所以這個公共字首必然重複出現兩次以上 可重疊 而任何兩個字尾的最長公共字首為某一段height值中的最小值,所以最大為height值中的...

字尾陣列求不可重疊最長重複子串 POJ 1743

不可重疊最長重複子串 pku1743 給定乙個字串,求最長重複子串,這兩個子串不能重疊。演算法分析 這題比上一題稍複雜一點。先二分答案,把題目變成判定性問題 判斷是否存在兩個長度為k 的子串是相同的,且不重疊。解決這個問題的關鍵還是利用height 陣列。把排序後的字尾分成若干組,其中每組的字尾之間...