POJ 2406 字尾陣列 求連續重複子串

2021-06-23 05:10:48 字數 1148 閱讀 1750

解法一:dc3求字尾

因為我用的是紅書的字尾模板,所以是倍增求的,所以這個dc3是用這個部落格的模板:

這個也是勉強過的,時間為:2829ms了,寫得不機智就會超了。

#include#include#define n 2000005

#define f(x) ((x)/3+((x)%3==1?0:tb))

#define g(x) ((x)b?a:b;

} int min(int a,int b)

void dc3(int *r,int *sa,int n,int m)

}return 0;

}

解法二:倍增演算法超時

但是還是把**貼出來吧,虧我還寫了好久,剛開始學的字尾加rmq的就t了,唉……看discuss說是倍增超時,dc3演算法求sa就不超時,沒想到還有這種題卡倍增的,剛開始還以為我轉換字串的時候超時呢……

#include#include#include#include#include#include#include#include#include#define mem(a,b) memset(a,b,sizeof(a))

#define lson i<<1,l,mid

#define rson i<<1|1,mid+1,r

#define llson j<<1,l,mid

#define rrson j<<1|1,mid+1,r

#define inf 0x7fffffff

#define maxn 1000010

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

void radix(int *str,int *a,int *b,int n,int m)

void suffix(int *str,int *sa,int n,int m) //倍增演算法計算出字尾陣列sa

{ static int rank[maxn],a[maxn],b[maxn];

for(int i=0; i=n?0:rank[j+(1<=0;i--)

dp[i]=min(dp[i+1],height[i+1]);

for(i=k+1;i

poj2406 求主串的週期子串

題目大意 給出乙個字串,將其分解為若干子串的和,求可分解的最多子串的個數。做題之前就知道這是一道kmp的題目,但一直沒想到怎麼寫 後面看了下別人的思路 最近寫題總是會忍不住看別人的思路 慚愧。得出結論 乙個串的週期子串長度 主串長 next 主串長度 然後再用主串長除以週期子串長度就得到了子串週期長...

poj2406 kmp,字尾陣列

開始是用字尾陣列做的,rmq果斷超了記憶體,全部改用unsigned short結果又超時,後來參考了 裡的方法。關鍵思想是設k為最小重複字串的長度,則s 0,1 n k 1 s k,k 1 n 1 即lcp rank 0 rank k n k 由於0位置是固定的,只需要對名次迴圈求出最小的k就行!...

字尾陣列求最長回文子串 POJ 3974

mle了.囧,不過演算法是正確的 define maxn 2000010 int wa maxn wb maxn wv maxn wss maxn int r maxn sa maxn int cmp int r,int a,int b,int l void da int r,int sa,int ...