感覺這篇部落格寫的不錯:
我就直接上**了。。。
1 #include2 #include3const
int n=110010;4
using
namespace
std;
5int
len;
6int p[n<<1];7
char s[n],str[n<<1];8
//陣列p[i]來記錄以字元str[i]為中心的最長回文子串向左(或向右)(包括str[i])的長度9//
id表示最大回文子串中心的位置
10//
mx則為id+p[id],也就是最大回文子串的邊界
1112
//最長回文子串o(n)求法
13void
manacher()else
19 p[i]=1;20
for(;str[i+p[i]]==str[i-p[i]];p[i]++);
21if(p[i]+i>mx)25}
26}2728
intmain()
37 len=(len<<1)+2
;38 str[len]='\0'
;39manacher();
40int ans=-1;41
for(int i=0;i)
44 printf("
%d\n
",ans-1
);45}46
return0;
47 }
HDU 3068 最長回文 最長回文子串
和上一題一樣,不過這題只是要求最長回文子串的長度 在此採用了非常好用的manacher演算法 據說還是o n 的效率qaq 詳細用法參考了上篇部落格的參考資料,這兩天有空學習一下 source code pragma comment linker,stack 16777216 for c compi...
HDU 3068 最長回文串
用的manacher法,o n 複雜度,證明跟kmp演算法一樣說不清 基本上是參考部落格鏈結 dp法記憶體不夠,中心擴充套件法時間不夠 manacher法 include include include include include include include include include ...
HDU 3068 最長回文串
解法1 根據是奇數串還是偶數串,遍歷中點,更新最長max值 複雜度o n 2 解法2 manacher 馬拉車演算法 o n 馬拉車演算法 1.中間插入 符號,統一變為奇數串規避奇偶問題 2.使用乙個輔助p陣列,p i 表示以 i 為中心的最長回文的半徑,p i 1正好是原字串中最長回文串的長度 3...