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