【noi34]パリンドローム

セグメンテーションは、実際に連続同一周期の両端から引き出され、そして残りの文字列が分割されています。のは、妥当性の最短期間外にそれをすべての貪欲を証明してみましょう:

S = A + B + Aとして示される2つの分割方法、検討および+ C = D + S C AはA | |その後とき2最短期間であるが、<| C | 、が明らかにC = A + + Eは、完了するまでに3倍に分割することができる Cを| | <| C | <2 | |場合、および、即ち、C 重なり、最短プレフィックスはならないが、重複部分(重複部分の両方の接頭辞である)サフィックス。

その後貪欲は、セットアップに使用するハッシュ暴力に裁判官を。

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#define MOD十億七
 4  の#defineっ長い長い
 5  の#define N 1000001
 6  int型のT、L。
7  LL和[N]、MI [N]。
8  チャーS [N]。
9 LL計算値(int型 L、INT R){
 10       リターン((和[R] -sum 1- [ 1 ] * MI [R-L + 1 ])%MOD + MOD)%のMOD。
11  }
 12  int型作業(int型 L、INTR){
 13      場合(L> R)戻り 0 ;
14      INT半ば=(L + 1、R + 1 >> 1)、K = L。
15      ながら(!(K <MID)&&(計算値(L、K)= CALC(L + RK、R)))ここで、k ++ ;
16      もし(K == MID)リターン 1 17      戻り作業(K + 1、L + rk- 1)+ 2 18  }
 19  INT メイン(){
 20       マイル[ 0 ] = 1 ;
21       のためのint型 I =1 ; iがNを<; I ++)は、MI [I] =(MI [I- 1 ] * 29)%のMOD。
22       のscanf(" %dの"、&T)。
23       一方(t-- ){
 24            のscanf(" %sの" 、S);
25            リットル=のSTRLEN(S)
26            和[ 0 ] =のS [ 0 ] - ' ' + 1 27 のためにint型 i = 1 ; iがLに<; I ++)は和[I] =(SUM [I- 1 ] * 29の + S [I] -           ' ' + 1)%のMOD。
28            のprintf(" %d個の\ n "、ワーク(0、L 1 ))。
29      }
 30 } 
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11272226.html