最長回文字串 POJ3974

2022-08-31 04:09:07 字數 875 閱讀 6801

曾經有乙個好演算法放到我面前,我沒有好好珍惜,直到用到的時候才後悔莫及。

那就是manacher(馬拉車演算法),以o(n)的複雜度計算最長回文字串。

曾經刷leetcode的時候,室友跟我說了這個演算法,但當時那個題目用中間列舉也過了,我就沒有在意,直到前天才弄會,寫這篇報告之前,

我又專門寫了一遍馬拉車,果然還是有點問題的。

詳細原理鏈結 點選 mark

#include #include 

#include

using

namespace

std;

const

int n = 1e6 + 50

;char

str[n];

char sstr[n*2

];int rad[n*2

];int manacher(char str, int

rad)

j = max(j-k, 0

); }

for(int i = 0; i < n; i++)

ans =max(ans, rad[i]);

return

ans;

}int

main()

sstr[

2*n] = '#'

; sstr[

2*n+1] = '\0'

; memset(rad,

0, sizeof

(rad));

int ans=manacher(sstr, rad);

printf(

"case %d: %d\n

", ++kase, ans);

}return0;

}

POJ3974 最長回文字串

在這裡採用的是雜湊 二分的方法。根據回文串的性質可知,可以將回文分成奇回文和偶回文分別進行處理。對於奇回文來說,每次列舉的端點一定是重合的,因此只需計算出端點左右公共的長度是多少即可,因此二分的是以該列舉點為中心的左半邊共有多少個字元。對於偶回文來說,每次列舉的端點不一定是相等的,因此在二分的是以當...

字尾陣列求最長回文子串 POJ 3974

mle了.囧,不過演算法是正確的 define maxn 2000010 int wa maxn wb maxn wv maxn wss maxn int r maxn sa maxn int cmp int r,int a,int b,int l void da int r,int sa,int ...

最長回文字串

scanf s 輸入字串碰到空格或者tab就會停下來。此處可以使用fgets或者gets 另外注意標頭檔案cctype中的函式的巧妙使用,此處使用isalpha和toupper簡化了 此處列舉字串的中間位置,然後向倆邊擴充套件,節省了時間複雜度,注意向倆邊擴充套件時,奇數個和偶數個長度的區別。另外程...