POJ 1743 字尾陣列

2021-08-18 08:01:47 字數 1246 閱讀 7700

這裡有一篇**總結了很多字尾陣列的用法,是 《

字尾陣列——處理字串的有力工具

》--羅穗騫

裡面又很多關於這個字尾陣列的具體用法,其中就包括這個不可重疊最長重複子串

這個題的意思就是求解不可重疊最長重複子串,但是這裡有乙個問題,他的串中也可以是相似的(每個數之間的差值相同的),那麼我們就可以利用這個差相同的性質,我們使用每個數的後面乙個數減去當前的這個數字,那麼相似的串之間的差值相同的,所以也就轉換成了不可重疊最長重複子串,我們這裡要處理一下,因為最後一位後面沒有數字了,我們就把它處理為0,這個地方不明白的話,可以看程式中的注釋

//不怕別人比你聰明,就怕別人比你聰明還比你努力

#include#include#include#include#include#include#include #include #include #include#include #define inf 0x3f3f3f3f

#define ll long long

using namespace std;

const int maxn = 21000;

int n,a[maxn],b[maxn],max_num;

int x[maxn],y[maxn],buc[maxn];

int sa[maxn],rank[maxn],height[maxn];

void da()

if(p >= n) break;

max_num = p;

}}void cal_height()

if(k) k--;

int j = sa[rank[i] -1];

while(b[i+k] == b[j+k] && i+k < n && j+k < n) k++;

height[rank[i]] = k;

}}bool isok(int k)

else

}if(maxsa - minsa >= k) return true;

return false;

}int main()

da();

cal_height();

//height陣列表示字典序相鄰兩個字尾的長度

int l = 0,r = n;

while(l <= r)

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

else

printf("0\n");

}}

poj 1743 字尾陣列

字尾陣列,求不可重疊最長重複字串。include include include include include include define maxd 21000 using namespace std int r maxd rank maxd height maxd int sa maxd wa...

POJ 1743(字尾陣列)

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

POJ 1743 字尾陣列

求滿足下列要求的最長子串 1.長度不小於5 2.出現兩次 子串整體加上某個值也算出現一次 3.兩次出現無重疊 難處理的是第二個要求 整體增加某個數也算出現一次 稍微思考一下便會得出 整體加上某個值後,相鄰數的差值是不變的 所以用乙個陣列r i 儲存mus i 1 與mus i 的差值 這裡要注意將差...