這裡有一篇**總結了很多字尾陣列的用法,是 《
字尾陣列——處理字串的有力工具
》--羅穗騫
裡面又很多關於這個字尾陣列的具體用法,其中就包括這個不可重疊最長重複子串
這個題的意思就是求解不可重疊最長重複子串,但是這裡有乙個問題,他的串中也可以是相似的(每個數之間的差值相同的),那麼我們就可以利用這個差相同的性質,我們使用每個數的後面乙個數減去當前的這個數字,那麼相似的串之間的差值相同的,所以也就轉換成了不可重疊最長重複子串,我們這裡要處理一下,因為最後一位後面沒有數字了,我們就把它處理為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 的差值 這裡要注意將差...