TopCoder SRM 396 Div1 Easy DNAString

問題

長さlの文字列sが、p周期であるとは、
すべての0≦i<l-pなるiについて、s[i+p]=s[i]を満たすことを言う。


A,C,G,Tからなる文字列が与えられる。
この文字列をmaxPeriod以下の周期を持つように書き換えたい。
最低でいくつの文字を書き換えなければならないか、求めよ。

制約条件

文字列の長さ≦2500
maxPeriod≦文字列の長さ

方針

O(長さ^2)で解ければよい。
maxPeriod以下の全てのperiodについて、その周期にするために必要な書き換え回数を求め、
その中の最小値を答える。


元の文字列から周期pをもつ文字列に書き換えるには、
周期でi番目の文字をそれぞれ集め、一番多い文字にその他の文字を全部書き換えてやるのが最善。

ソースコード

class DNAString {
  public:
  int minChanges(int maxPeriod, vector <string> dna) {
    int num[256];
    num['A']=0; num['C']=1; num['G']=2; num['T']=3;
    
    string str=accumulate(all(dna),string());
    int n=str.size(),ans=inf;
    for(int p=1;p<=maxPeriod;p++){
      int tmp=0;
      rep(i,p){
        int cnt[4]={};
        for(int j=i;j<n;j+=p)cnt[num[str[j]]]++;
        sort(cnt,cnt+4);
        tmp+=cnt[0]+cnt[1]+cnt[2];
      }
      ans=min(ans,tmp);
    }
    return ans;
  }
};