C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

ARC049-A "強調"|AtCoder

今日はARC049に参加して
A: "強調" - AtCoder Regular Contest 049 | AtCoder
を解きました!

#include<bits/stdc++.h>
using namespace std;
int main() {
    string s;
    int a,b,c,d;
    cin >> s >> a >> b >> c >> d;
    int len=s.size();
    for(int i=0; i<=len; i++){
        if(i==a){s.insert(s.begin()+a,'\"');}
        else if(i==b){s.insert(s.begin()+b+1,'\"');}
        else if(i==c){s.insert(s.begin()+c+2,'\"');}
        else if(i==d){s.insert(s.begin()+d+3,'\"');}
    }
    cout << s << endl;
    return 0;
}

文字列の中に " (ダブルコーテーション)を挿入するという問題。
今日は簡単だなぁ...って思いながら普通に解いていたら...!!!
ダブコが無限にエラーを起こす...!
すぐさまggったのですが、どうやら「¥"」と入力しないとダメな様で...。
そこまでは解ったのですが、「¥"」(円マーク+")をコピペしても無限にエラー...。
(ここで殆どの時間を消費する)
どうやら...「\"」(バックスラッシュ+")でないとダメだった様です....。
なんとか時間内にAC出来て良かったです...。
しかもNO WAだー!(やったね!)

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s;
    int a,b,c,d;
    cin >> s >> a >> b >> c >> d;
    int len=s.size();
    for(int i=0; i<=len; i++){
        if(i==a){s.insert(s.begin()+d,'\"');}//後ろから挿入
        else if(i==b){s.insert(s.begin()+c,'\"');}
        else if(i==c){s.insert(s.begin()+b,'\"');}
        else if(i==d){s.insert(s.begin()+a,'\"');}
    }
    cout << s << endl;
    return 0;
}

/* 大反省会 */

文字列を前から数えて行くと、
文字の位置を増えたダブコの数だけずらさないといけなくなります。
しかし、文字列の後ろから挿入していくと、+1していく処理が不要みたいでした。
なるほどなあ...といった感じでした。動作を確認しました。(おしまい)

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin>>s;
    s += '\n'; //終端処理
    int a,len=s.size();
    vector<int> vc;
    while(cin>>a){vc.push_back(a);}
    for(int i=0; i<len; i++){
        if(find(vc.begin(),vc.end(),i) !=end(vc)){
            cout << '"';
        }
        cout << s[i];
    }
    cout << flush; //endlでない
    return 0;
}

/* 復習 */

とーらすさんのコードでfindで解ける方法を学習しました。
利点はダブコの文字数を増やす必要が無くなる点ですかね...!
しかし...文字列を検索(find)するのではなく、
ダブコの位置の方を検索するとは思わなかった...(難しい)

1つの問題で複数の解法を書いてみるのは勉強になりますね。
AtCoderで強い人のコードが見れるの本当に楽しい。