1つの // 番号HW / 2即ちI回文ストリング中心 2 // 長さを- 1、即ちパリンドローム配列I HW [I]を中心とする 3。 // COは+ N前後のすべての文字を挿入A '#' 。4インラインボイド変更(){ 5 S [ 0 ] = S [ 1 ] = ' #' ; // 挿入添字1を開始する 。6 ため(INT I = 0、I <N - 、I ++ ) { 7 S [I * 2 + 2 ] = A [I]; 8 S [I * 2 + 3 ] = ' #'; 9 } 10 N = N * 2 + 2 ; // すなわちN * 2 + 1、n値の無意味な文字 11 S [N] = 0 ; 12である } 13が 14インラインボイドmanacher(){ 15 INT maxright = 0 、MID; 16 用(INT I = 1 ; I <N-; I ++){ // 列挙... 2N-1 1。 17。 IF(I < maxright) 18が HW [I] =分(HW [( << MID 。1) - I]、HW [MID] + MID - I); 19。 // HW [(中間<< 1)-i] iの中間点対称性についてである。Hwの[中間] +ミッド I、 半径右外側境界パリンドローム配列iが 20である、 他の 21は HW [I] = 。1 ; // HW [i]はiはパリンドローム半径の外に拡張することができる点を表し 22は 、一方(S [I + HW [I]] == S [I - HW [I]]) // S []ストア列に 23は ++ ; HW [I] 24 IF(HW [I] + I> maxright){ 25 maxright HW = [I] + I; 26である MID = I; 27 } 28 } 29 }