HDU 3068 最長回文串

2021-09-03 07:03:44 字數 783 閱讀 6851

解法1:根據是奇數串還是偶數串,遍歷中點,更新最長max值 複雜度o(n^2)

解法2:manacher(馬拉車演算法) o(n)

馬拉車演算法

1.中間插入#符號,統一變為奇數串規避奇偶問題

2.使用乙個輔助p陣列,p[i]表示以 i 為中心的最長回文的半徑,p[i] - 1正好是原字串中最長回文串的長度

3.利用已經求過的p[j]來加快求p[i]的值

mx 和 id 。mx 代表以 id 為中心的最長回文的右邊界,也就是mx = id + p[id]

#include #include #include using namespace std;

const int maxn = 110005;

char s[maxn];

char s_new[maxn * 2];

int p[maxn * 2];

int init()

s_new[j] = '\0'; // 別忘了哦

return j; // 返回 s_new 的長度

}int manacher()

max_len = max(max_len, p[i] - 1);//記錄每個p[i] - 1的最大值

}return max_len;

}int main()

return 0;

}

HDU 3068 最長回文串

用的manacher法,o n 複雜度,證明跟kmp演算法一樣說不清 基本上是參考部落格鏈結 dp法記憶體不夠,中心擴充套件法時間不夠 manacher法 include include include include include include include include include ...

最長回文串 hdu3068

給出乙個只由小寫英文本元a,b,c.y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c.y,z組成的字串s 兩組case之間由空行隔開 該空行不用處理 字串長度len 1...

HDU 3068 最長回文

題 目 鏈 接 看完後自己寫了一遍,感覺真的是很神奇的結論啊!本來這題看到可以用字尾陣列來寫的,但沒有學過,去看了一下,真心給暈了,決定找個機會認真研究下。我的 include include includeusing namespace std define min a,b a b a b cha...