寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #B - 愉快なロゴデザイン

JOI春合宿2015 オンラインジャッジから、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#B - 愉快なロゴデザイン

www.ioi-jp.org

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#B - 愉快なロゴデザイン
https://www.ioi-jp.org/camp/2015/2015-sp-tasks/index.html
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
bool f(char a,char b){
  return ((a!=b) && (a!='*'));
}
int main(void){
  ll K;
  cin>>K;
  string s;
  cin>>s;
  ll n=s.size();
  reverse(s.begin(),s.end());
  s+=s+s;
  ll ans=n;
  ll cnt=0;
  for(ll i=0,j=1,k=1;i<K;i++,k*=4){
    for(ll l=0;l<k;l++){
      cnt+=f(s[j+l],'I');
    }
    j+=k;
    for(ll l=0;l<k;l++){
      cnt+=f(s[j+l],'O');
    }
    j+=k;
    for(ll l=0;l<k;l++){
      cnt+=f(s[j+l],'J');
    }
    j+=k;
  }
  for(ll l=1;l<n;l++){
    for(ll i=0,j=l,k=1;i<K;i++,k*=4){
      cnt-=f(s[j],'I');
      cnt+=f(s[j+k],'I');
      j+=k;
      cnt-=f(s[j],'O');
      cnt+=f(s[j+k],'O');
      j+=k;
      cnt-=f(s[j],'J');
      cnt+=f(s[j+k],'J');
      j+=k;
    }
    ans=min(ans,cnt);
  }
  cout<<ans<<endl;
  return 0;
}