窮舉每一位,然後計算以這個字元為中心的最長回文子串。注意這裡要分兩種情況,一是回文子串的長度為奇數,二是長度為偶數。兩種情況都可以轉化為求乙個字尾和乙個反過來寫的字尾的最長公共字首。具體的做法是:將整個字串反過來寫在原字串後面,中間用乙個特殊的字元隔開。這樣就把問題變為了求這個新的字串的某兩個字尾的最長公共字首。int r[maxn]; // r 陣列儲存了字串中的每個元素值,除最後乙個元素外,每個元素的值在 1..m 之間,最後乙個元素的值為 0
int wa[maxn], wb[maxn], wv[maxn], ws[maxn]; // 這 4 個陣列是字尾陣列計算時的臨時變數,無實際意義
int sa[maxn]; // sa[i] 儲存第 i 小的字尾在字串中的開始下標,i 取值範圍為 0..n-1
int cmp(int *r, int a, int b, int l)
void da(int *r, int *sa, int n, int m)
return;
}int rank[maxn]; // rank[i] 表示從下標 i 開始的字尾的排名,值為 1..n
int height[maxn]; // 下標範圍為 1..n,height[1] = 0
void calheight(int *r, int *sa, int n)
int log[maxn];
int st[30][maxn];
int a[maxn];
void get_rmq(int n)
for(int i=1;i<=n;i++)
for(int i=1;i<=log[n];i++)
r[len]=0;
da(r,sa,len+1,128);
calheight(r,sa,len);
get_rmq(len);
solve();
}return 0;
}
ural 1297 字尾陣列 最長回文子串
題意 給出乙個字串求最長回文子串 題,把字串反過來複製一遍到後邊,中間用乙個沒出現的字元隔開,然後就是列舉當以i位置為中間位時的最長回文串 是多大,就是求這中間的heigh陣列的最小值。用rmq預處理。列舉位置時分回文串長度是奇數還是偶數。include include include using ...
URAL 1297 字尾陣列 求最長回文子串
思路 這題下午搞了然後一直wa,後面就看了discuss,裡面有個陣列 abcdefdcba,這個我輸出abcd,所以錯了。然後才知道自己寫的字尾陣列對這個回文子串有bug,然後就不知道怎麼改了。然後看題解,裡面都是用rmq先預處理任意兩個字尾的最長公共字首,因為不太知道這個,所以又看了一下午,嘛嘛...
字尾陣列 最長回文字串 ural1297
題意 求一串字串的最長回文字串.思路 在原串後面加乙個獨一無二的字元,再把原串倒過來接在原串後面。這樣,要是有回文串的話,其必然有兩個字尾的字首相同這樣,我們就可以列舉以每個字元為 k 中心的回文串,再找到它倒過來後所對應的那個位置2 len sa k 找到排在這之間的最小height值,也就是這兩...