ural 1297 字尾陣列 最長回文子串

2022-08-20 11:12:18 字數 911 閱讀 5635

題意:給出乙個字串求最長回文子串

**:

//

**題,把字串反過來複製一遍到後邊,中間用乙個沒出現的字元隔開,然後就是列舉當以i位置為中間位時的最長回文串

//是多大,就是求這中間的heigh陣列的最小值。用rmq預處理。列舉位置時分回文串長度是奇數還是偶數。

#include#include

#include

using

namespace

std;

const

int maxn=3000

;int sa[maxn+9],ra[maxn+9],he[maxn+9],buc[maxn+9],xx[maxn+9],yy[maxn+9],f[maxn+9][30

];int

len,m;

char s[maxn+9

];void

get_suf()

if(p>=len) break

; m=p;

}for(int i=0;ii;

int k=0

;

for(int i=0;i)

if(k) k--;

int j=sa[ra[i]-1

];

while(s[i+k]==s[j+k]&&i+k;

he[ra[i]]=k;

}}void rmq1(intn)}

int rmq2(int l,int

r)int

main()

}if(i!=x&&i!=0

) }

}for(int i=id;i"%c"

,s[i]);

printf("\n

");}

return0;

}

URAL1297 字尾陣列

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

ural1297 字尾陣列 RMQ

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段 可以重疊 那最值就是這兩段的最...

字尾陣列 最長回文字串 ural1297

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