ABC033_C

1+2*3+0+5*6+7
のように+か*で繋がった式が与えられる.
式の結果が0となるように,式のある値を0に入れ替える.
この時最小の入れ替え回数を求めるという問題.

足し算はそれぞれの値で0と入れ替えなければならない.
掛け算はひとつ0があればよい.
掛け算のほうが足し算より演算の順が先である.

これらを考えると'+'で分ければよいことがわかる.
上の式の場合,このように分けられる.
1
2*3
0
5*6
7
それぞれが0にしなければか?すでに0になっているのか?をカウントしていく.

#include <bits/stdc++.h>
using namespace std;

vector<string> split(const string &s, char delim)
{
    vector<string> elems;
    stringstream ss(s);
    string item;
    while(getline(ss,item,delim)){
        if(!item.empty()){
            elems.push_back(item);
        }
    }
    return elems;
}

bool contain_zero(string s){
    for(int i=0;i<(int)s.size();i+=2){
        if(s[i]=='0')return true;
    }
    return false;
}

int main()
{
    string s;
    vector<string> items;
    cin>>s;
    items = split(s,'+');
    int count = 0;
    for(int i=0;i<(int)items.size();i++){
        if(!contain_zero(items[i]))count++;
    }
    cout<<count<<endl;
    return 0;

}

文字列からある文字でスプリットしたいとき

vector<string> split(const string &s, char delim)
{
    vector<string> elems;
    stringstream ss(s);
    string item;
    while(getline(ss,item,delim)){
        if(!item.empty()){
            elems.push_back(item);
        }
    }
    return elems;
}