pku1743 不可重疊最長重複子串

2021-07-25 09:08:12 字數 1194 閱讀 8501

題目還是自己找吧,我有點懶啦。

今天我寫一下字尾陣列的部落格,php的更新鮮停一天。

給定乙個字串,求最長重複子串,這兩個子串不能重疊。

演算法分析:

先二分答案,把題目變成判定性問題:判斷是否存在兩個長度為k的子串是相同的,且不重疊。解決這個問題的關鍵還是利用height陣列。把排序後的字尾分成若干組,其中每組的字尾之間的height值都不小於k。例如,字串為「aabaaaab」,當k=2時,字尾分成了4組,如圖5所示。

容易看出,有希望成為最長公共字首不小於k的兩個字尾一定在同一組。然後對於每組字尾,只須判斷每個字尾的sa值的最大值和最小值之差是否不小於k。如果有一組滿足,則說明存在,否則不存在。整個做法的時間複雜度為o(nlogn)。

思路是這樣的啦,**嘿嘿嘿。。

#include

#include

#include

#include

#include

#include

using

namespace

std;

int a[210000],wr[210000],mc[210000],js[210000],sa[210000],y[210000],height[210000];

bool cmp(int k1,int k2,int ln)

void get_sa(int n,int m)

//得到新的mc陣列

m=p;ln*=2;

}a[0]=0;sa[0]=0;

}void get_he(int n)

}bool check(int n,int k)

}return

false;

}void erfen(int n)

else r=mid-1;

}if(ans>=4)printf("%d\n",ans+1);

else

printf("0\n");

}int main()

get_sa(n-1,200);

get_he(n-1);

erfen(n-1);

}return

0;}

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

poj 1743 二分答案,把題目變成判定性問題 判斷是否 存在兩個長度為k的子串是相同的,且不重疊。解決這個問題的關鍵還是利用 height陣列。把排序後的字尾分成若干組,其中每組的字尾之間的height值都 不小於k。有希望成為最長公共字首不小於k的兩個字尾一定在同一組。然 後對於每組字尾,只須...

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

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

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

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