manacherテンプレート

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 }

 

おすすめ

転載: www.cnblogs.com/hhyx/p/12528791.html