URAL 1297 字尾陣列 求最長回文子串

2021-06-23 05:12:52 字數 1625 閱讀 9050

思路:這題下午搞了然後一直wa,後面就看了discuss,裡面有個陣列:abcdefdcba,這個我輸出abcd,所以錯了。

然後才知道自己寫的字尾陣列對這個回文子串有bug,然後就不知道怎麼改了。

然後看題解,裡面都是用rmq先預處理任意兩個字尾的最長公共字首,因為不太知道這個,所以又看了一下午,嘛嘛……

然後理解rmq和字尾一起用的時候才發現其實這裡不用rmq也可以,只要特殊處理一下上面這個沒過的例子就行了,哈哈……機智……

解法一:

這個是不用rmq做的:

#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 4010

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)

else if(height[i]==len)

pos=min(pos,min(sa[i],sa[i-1]));

}if(len>1) cout《解法二:

這個是用rmq的,我是弄懂了rmq和height陣列聯合使用來處理問題了之後我才寫,本來開始就寫對了,但是剛開始處理的那個字元錯了,然後除錯了好久才好。

對字串奇偶性作判斷,因為……這個自己寫個串出來自己判定一下就明白了,**裡面也說得挺清楚的了。

另外為什麼要奇偶判斷,是因為要判斷字元與其對稱的字元是不是一樣,不然的話這個樣例就過不了:abcefcba

#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 2010

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

}for(i=pos; i

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