bit全探索

ARCのC問題をときます
bit全探索というのを使うらしいです
arc061.contest.atcoder.jp

最初見たときは再帰関数でしか実装の仕方がわからなかったので、bitを使って全探索する方法をしらべました。

すると二進数のbitを区切りに見立てて0x0000000〜0x1111111の範囲を全部調べれば良いことがわかりました

区切りが出てくるまで数字を加算して
区切りが出て来たら数字を整形、全体の和に足すみたいな感じです

書いたコード

#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>
using namespace std;
int i,j,k;
string s;
vector<long int> nums;
long int sum;
long int fac;//+で区切られた数

int main(){
    cin>>s;
    //各桁の値をnumsに格納
    for(i=0;i<s.length();i++)nums.push_back(stoi(s.substr(i,1)));
    //全パターン
    for(i=0;i< 1<<(nums.size()-1);i++){
        //1パターン
        //cout<<endl<<i<<"---------"<<endl;
        fac=0;
        for(j=0;j<nums.size();j++){
            fac+=nums[j];
            if(((i>>j)&1)==1){
                sum+=fac;
                //cout<<fac<<endl;
                fac=0;
            }else{
                fac*=10;
            }
        }
        //cout<<fac/10<<endl;
        sum+=fac/10;
        //cout<<endl<<i<<endl;
    }
    cout<<endl<<sum;
    return 0;
}

これでなんでACできたかわかりませんがまあまあ短く書けました

参考サイト
初めてのビット操作を使った全探索 - マツシタのお勉強メモ
bit全探索 - whileD'iary