頭良くなりたい人

文系大学生shadeのブログです。競技プログラミングや人文学の話題,受験ネタなど。

ABC045 (ARC061) C - たくさんの数式

問題はこちら atcoder.jp

方針

+が入る場所は,S の各数字の間 |S|-1 ヶ所です。それぞれの箇所について,+が入っている状態を1,何も入っていない状態を0とすれば,bit全探索が適用できます。

各数式の値を計算するプロセスはコードを見てください。

コード

#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for(int i=0; i<(n); i++)

long long value(int bit);

string s;
int n;

int main(){
    cin>>s;
    n=s.size()-1;   // '+'が入るスペースの数
    long long sum=0; 

    for(int bit=0; bit<(1<<n); bit++){
        sum+=value(bit);
    }

    cout<<sum<<endl;
}

long long value(int bit){
    long long v=0;
    // 0文字目
    string c=s.substr(0,1);

    REP(i,n){  
        // i番目が'+'なら
        if(bit&(1<<i)){
            v+=stoll(c);
            c.clear();
            c=s.substr(i+1,1);
        // そうでないなら
        }else{
            c+=s.substr(i+1,1);
        }
    }
    // 最後に残っている部分を足す
    v+=stoll(c);
    
    return v;
}