曾經有乙個好演算法放到我面前,我沒有好好珍惜,直到用到的時候才後悔莫及。
那就是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簡化了 此處列舉字串的中間位置,然後向倆邊擴充套件,節省了時間複雜度,注意向倆邊擴充套件時,奇數個和偶數個長度的區別。另外程...