解法一: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 ...