CodeForces 1332-C K-コンプリートワード(パリンドローム配列セグメント)

 

 

 

 

 

 

 

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 }

 

 

 

 

 

 

 

 

-

おすすめ

転載: www.cnblogs.com/jiamian/p/12616178.html