題意:給出乙個字串求最長回文子串
**:
//**題,把字串反過來複製一遍到後邊,中間用乙個沒出現的字元隔開,然後就是列舉當以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值,也就是這兩...