1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a, b, c;
    cin >> a >> b >> c;
    int n = a.size();
    vector<int> va, vb, vc;
    for (int i=0; i < n; i++) {
        va.push_back(a[i]-'0');
        vb.push_back(b[i]-'0');
        vc.push_back(c[i]-'0');
    }

    long long int res = 0;
    for (int i=n-1; i >= 0; i--) {
        // skip non interesting part
        while (i >= 0 && (va[i] + vb[i]) % 10 != vc[i])
            i--;
        if (i < 0)
            break;
        // interesting part begins
        long long int elems = 0;
        while ( i >= 0 && (va[i] + vb[i]) % 10 == vc[i]) {
            //cout << "INT PART: " << i << ' ' << va[i] << ' ' << vb[i] << '\n';
            if (va[i] + vb[i] < 10) {
                elems++;
                i--;
            }
            else {
                int carry = 0;
                while (i >= 0) {
                    int val = va[i] + vb[i] + carry;
                    //cout << i << ' ' << val << ' ' << vc[i] << '\n';
                    if (val % 10 != vc[i]) {
                        res += elems * (elems + 1) / 2;
                        elems = 0;
                        break;
                    }
                    else if (val < 10) {
                        elems++;
                        i--;
                        break;
                    }
                    else {
                        carry=1;
                        i--;
                    }
                }
            }
        }
        //if (elems > 0)
        //    cout << i << ' ' << elems << '\n';
        res += elems * (elems + 1) / 2;
    }

    cout << res << '\n';

    return 0;
}