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 陣列。把排序後的字尾分成若干組,其中每組的字尾之間...