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值,也就是這兩...