UVA 1297 最長回文串 裸

2021-06-28 15:58:23 字數 1054 閱讀 3643

題目大意:給一行字母,只有字母,最多1000個字母。 求最長回文穿,有多個情況下,輸出最前面的那個。

這次終於讓我字尾陣列不tle了…… 哇哇哇哇哇!  我就是喜歡用線段樹寫rmq……慢就慢,我不管了

#include #include #include using namespace std;

const int max_strlen = 4000 + 10;

char text[max_strlen];

int tub[max_strlen], wa[max_strlen], wb[max_strlen], wv[max_strlen];

int r[max_strlen], height[max_strlen], rank[max_strlen];

int totlen, sa[max_strlen];

int textlen;

bool cmp(int *r, int a, int b, int l)

void da(int *r, int *sa, int n, int m)

}void calheight(int *r, int *sa, int n)

void hzsz()

struct node

node()

}root, tnull, *null = &tnull;

int mt(node &now, int ll, int rr)

int find(node &now, int ll, int rr)

void doit()

a = rank[i];

b = rank[totlen - i];

if (a > b) swap(a, b);

tmp = find(root, a + 1, b) * 2;

if (tmp > ans)

}if (flag == 1) //奇數的情況

{ int tmp = ans / 2;

for (int i = wz - tmp; i < wz + tmp; ++ i) cout<

URAL 1297 最長回文子串

窮舉每一位,然後計算以這個字元為中心的最長回文子串。注意這裡要分兩種情況,一是回文子串的長度為奇數,二是長度為偶數。兩種情況都可以轉化為求乙個字尾和乙個反過來寫的字尾的最長公共字首。具體的做法是 將整個字串反過來寫在原字串後面,中間用乙個特殊的字元隔開。這樣就把問題變為了求這個新的字串的某兩個字尾的...

字尾陣列 最長回文字串 ural1297

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

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

題意 給出乙個字串求最長回文子串 題,把字串反過來複製一遍到後邊,中間用乙個沒出現的字元隔開,然後就是列舉當以i位置為中間位時的最長回文串 是多大,就是求這中間的heigh陣列的最小值。用rmq預處理。列舉位置時分回文串長度是奇數還是偶數。include include include using ...