思路:這題下午搞了然後一直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值,也就是這兩...