ural1297 字尾陣列 RMQ

2022-03-11 00:52:37 字數 1291 閱讀 4750

rmq即求區間(i,j)的最值。通過o(nlogn)處理,o(1)給出答案。

rmq主要是動態規劃來做。dp[i][j]表示從i開始的長為2^j的區間最值。

那麼可以得到dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);

dp[i][j],這個區間可以分為2段(可以重疊),那最值就是這兩段的最值。

查詢時要找到那個j,那j=(int)(log((y-x+1)*1.0)/log(2.0));

對於求回文 可以轉變為當前的位子進行列舉 求當前的位置的字尾和當前位置的前面部分的公共長度,又前面一部分就是在後面新增的2*n-i的位置

所以只要求出height[i+1.....2*n-i]的最小值,這裡就用到rmq來做;

#include#include

#include

#include

//#include

#define maxn 2100

#define ll long long

using

namespace

std;

intwa[maxn],wb[maxn],wv[maxn],ws[maxn],n;

int dp[maxn][25

];int cmp(int *r,int a,int b,int

l)int min(int x,int

y)void da(int *r,int *sa,int n,int

m)

return;}

intrank[maxn],height[maxn];

void calheight(int *r,int *sa,int

n)int

r[maxn],sa[maxn];

void

rmq()

}int lcp(int left,int

right)

a++;

int k=(int)(log((b-a+1)*1.0)/log(2.0

));

return min(dp[a][k],dp[b-(1

<1

][k]);

}char

s[maxn];

intmain()

res=lcp(i,2*n-i+1)*2;//

對於偶數

if(res>ans)

}if(ans%2

)

}else

}printf("\n

");//system("pause");

}

URAL1297 字尾陣列

題目意思 給你乙個字串,要你求出最長的回文子串 解題思路 把原串的反串加個原串後面,中間加個沒有出現過的字元 然後,原串中,下標i在反串中對應的位置為2 l i 如果求以i為對稱軸的回文串,我們求suffix i 和suffix 2 l i 的lcp 如果求以i和i 1為對稱軸的回文串,我們求suf...

ural1297字尾樹組 2

題意 給定乙個字串,輸出其最大回文子串 分析 可以用manacher很方便求解,也可以用字尾陣列。對字尾樹組而言,先中間設定乙個不存在的值,反向接到後面。rmq處理之後,每次對lcp i,n i 1 求以i為中心的奇數的回文串,lcp i,n i 求以i和i 1為中心的偶數回文串長度。include...

字尾陣列 最長回文字串 ural1297

題意 求一串字串的最長回文字串.思路 在原串後面加乙個獨一無二的字元,再把原串倒過來接在原串後面。這樣,要是有回文串的話,其必然有兩個字尾的字首相同這樣,我們就可以列舉以每個字元為 k 中心的回文串,再找到它倒過來後所對應的那個位置2 len sa k 找到排在這之間的最小height值,也就是這兩...