題意:給乙個陣列表示一段**,範圍1~88;問為最長的的位置不相交的相似的旋律。相似的意思是,整段加上某個值,比如1 2 3 4 5 和 6 7 8 9 10是相似。
題解:求出字尾陣列,高度陣列lcp,列舉答案x ,找到乙個對於連續的lcp[i]>=x,找到看最小的sa[i],最大的sa[i],看是否差值大於l,就可以判斷是否重疊。
//#include
#include#include
#include
#include
#include
#define pb push_back
#define ll long long
#define pi 3.14159265
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define ws wppp
#define eps 1e-7
using
namespace
std;
const
int n=2e4+5
;const
int mod=1e9+7
;int
a[n], s[n];
intsa[n], t[n], t2[n], c[n], n;
intran[n], height[n];
const
int inf=0x3fffffff
;void get_sa(int
m)
int k = 0
;
for(i = 0; i < n; i++) ran[sa[i]] =i;
for(i = 0; i < n; i++)
}bool judge(int
x)
else
}return
false;}
intmain()
s[n-1]=0
; get_sa(
200);
int l=0,r=n;
while(l<=r)
if(r>=4)printf("
%d\n
",r+1
);
else printf("
0\n"
); }
return0;
}
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 字尾陣列
這裡有一篇 總結了很多字尾陣列的用法,是 字尾陣列 處理字串的有力工具 羅穗騫 裡面又很多關於這個字尾陣列的具體用法,其中就包括這個不可重疊最長重複子串 這個題的意思就是求解不可重疊最長重複子串,但是這裡有乙個問題,他的串中也可以是相似的 每個數之間的差值相同的 那麼我們就可以利用這個差相同的性質,...
POJ 1743(字尾陣列)
給定乙個字串,求最長重複子串,這兩個子串不能重疊。演算法分析 這題比上一題稍複雜一點。先二分答案,把題目變成判定性問題 判斷是否 存在兩個長度為 k 的子串是相同的,且不重疊。解決這個問題的關鍵還是利用height 陣列。把排序後的字尾分成若干組,其中每組的字尾之間的 height 值都不小於 k。...