ARC019

1年半ぶりに参加。

  • -

A : お買い物クライシス

  • 指定の文字を指定の数字に変えるだけの簡単なお仕事
  • A問題だしと思ってテストせずに投げた。通って良かった。
#include <iostream>
#include <string>

using namespace std;

int main(){
    string s;
    while(cin >> s){
        for(int i=0;i<s.size();i++){
            if(s[i] == 'O') s[i] = '0';
            if(s[i] == 'D') s[i] = '0';
            if(s[i] == 'I') s[i] = '1';
            if(s[i] == 'Z') s[i] = '2';
            if(s[i] == 'S') s[i] = '5';
            if(s[i] == 'B') s[i] = '8';
        }
        cout << s << endl;
    }
}

B : こだわりの名前

  • 無意識に回文の種類数を数えてたぜ…(サンプルテストして気付いた)。
  • 何でサンプル通らないんだろうと思ったけど、問題文は良く読めという事ですね。
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
    string s;
    while(cin >> s){
        int n = s.size();
        int error = 0;
        for(int i=0;i<n-1-i;i++){
            if(s[i] != s[n-1-i]) error++;
        }
        if(error == 0){
            cout << 25*(n%2 == 0 ? n : n-1) << endl;
        }
        else if(error == 1){
            cout << 25*n-2 << endl;
        }
        else {
            cout << 25*n << endl;
        }
    }
}

C : 最後の森

  • ワカンネってなってD問題に逃避した。
  • 中継地点全探索すれば良くね?と終了間際に思ったものの、3ケースだけ合わず撃沈。

D : ほんとうのたたかい

  • 伝説の剣の名前を見てグラフのやばい問題に違いないと思って開いた。
  • 違った。
  • 電王戦の記者会見が盛り上がってたので、チラ見しながら考える。
  • 素数個単位で適当にずらせば良くねという結論になり、並べてみた。
  • 1728個配置できた。
  • 投げた→WA
  • なんでや!と思って問題文よく読んだら出力行数も必要だったので加えて投げた→WA
  • なんでや!と思って問題文よく読んだら'O'を'o'にしてたので直して投げた→AC
  • 'o'と'O'の違いが分かる大人になりたかった。
#include <iostream>

using namespace std;

char s[150][151];

int main(){
    for(int i=0;i<150;i++){
        for(int j=0;j<150;j++)
            s[i][j] = '.';
        s[i][151] = '\0';
    }
    for(int i=0;i<13;i++){
        for(int j=0;j<13;j++){
            if(13*i+j >= 150) break;
            s[i][13*i+j] = 'O';
        }
    }
    for(int i=0;i<13;i++){
        for(int j=0;j<13;j++){
            if(13*j+i >= 150) break;
            s[13+i][13*j+i] = 'O';
        }
    }

    for(int i=1;i<=13;i++){
        for(int j=0;j<13;j++){
            if(13*i+13+j >= 150) break;
            int cur = j, bit = 1<<j;
            for(int k=0;k<13;k++){
                if(13*k+cur >= 150) break;
                s[13*i+13+j][13*k+cur] = 'O';
                cur = (cur+i)%13;
                while(k<11 && (bit&(1<<cur))){
                    cur = (cur+1)%13;
                }
                bit |= (1<<cur);
            }
        }
    }
    cout << 150 << endl;
    for(int i=0;i<150;i++){
        cout << s[i] << endl;
    }
}
  • -

今日のまとめ:日本語といえど問題文はちゃんと読みましょう