https://codeforces.com/contest/1332/problem/C
質問意図されている:長さの文字列にN、あなたが等しいn個にそれを修正するように/パリンドロームセグメント部をK、変更の最小数を見つけます。
アイデア:K区によって、我々は最初の文字列の長さ:
{XXX ... XX} {XXX ... XX} ... {XXX ... XX}
最後の要件は、各位置における各文字が現れる数はパーティションであり、そして貪欲、最も頻繁に発生することができ、各パーティションが正確に同じパリンドローム配列、レコード長[K / 2]であるように、パリンドローム配列です。文字は、他の文字を取り除く全体のgetを変更しないでください。
1の#include <ビット/ STDC ++ H> 2のtypedef 長い 長LL。 3 CONST INT INF = 0x3f3f3f3f 。 4つの CONST ダブル EPS = 1E- 8 。 5 のconst int型のmod = 1E8; 6 CONST INT MAXN = 2E5 + 10 。 7 使用して 名前空間はstdを、 8 9 のint A [MAXN] [ 30 ]。 10 CHAR STR [MAXN]。 11 12 のint main()の 13 { 14 DEBUGの#ifdef 15 freopenは(" SAMPLE.TXT "、" R " 、STDIN)。 16 #endifの 17 18 INT T。 19 のscanf(" %dの"、&T)。 20 一方(T-- ) 21 { 22 INT N、K。 23 のscanf(" %D%D%S "、&N&K、STR)。 24 のために(INT iが= 0 ; iが<N; iが++ ) 25 [分(I%のK、KI%K- 1)] [STR [I] - [ A ' ] ++ ; 26 INT ANS = 0 。 27 のために(INT iが= 0 ; I <kは、iが++ ) 28 { 29 のint NUM = 0 。 30 INT MAX = 0 。 31 のために(INT J = 0 ; J < 26 ; J ++ ) 32 { 33 NUM + = [I] [J]。 34 MAX = MAX(MAX、[I] [J])。 35 [I] [J] = 0 ; 36 } 37 ANS + = num- MAX。 38 } 39 のprintf(" %dの\ n " 、ANS)。 40 } 41 42 戻り 0 ; 43 }
-