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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int> trans;
//1 - zgadza sie bez pusha
//2 - zgadza sie i push
//3 - potrzebuje pusz i wtedy ok
//4 - potrzbuje pusz i wtedy pusz
//5 - kodon stop
const int s = 1e6+9;
bool valid[s];
int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(0);
    string a,b,c;
    cin>>a>>b>>c;
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    reverse(c.begin(),c.end());
    int n = a.length();
    for (int i = 0; i < n; i++) {
        int f = a[i] - '0';
        int s = b[i] - '0';
        int goal = c[i] - '0';
        if (f + s == goal) {
            trans.push_back(1);
            continue;
        }
        if ((f+s)-10 == goal) {
            trans.push_back(2);
            continue;
        }
        if (f+s+1 == goal) {
            trans.push_back(3);
            continue;
        }
        if ((f+s+1)-10 == goal) {
            trans.push_back(4);
            continue;
        }
        trans.push_back(5);
    }
    int count = 0;
    int last = -1;
    int ans = 0;
    for (int i = 0; i<n; i++) {
        if (trans[i] == 1) {
            if (last == 3 or last == 1) {
                count++;
            }else {
                ans += count*(count+1)/2;
                count = 1;
            }
            valid[i+1] = true;
        }
        if (trans[i] == 2) {
            if (!(last == 1 or last == 3)) {
                ans += count*(count+1)/2;
                count = 0;
            }
            valid[i+1] = true;
        }
        if (trans[i] == 3) {
            if (!(last == 2 or last == 4)) {
                ans += count*(count+1)/2;
                count = 0;
            }else {
                if (valid[i]) {
                    count++;
                }
            }
            if (last == 2 and valid[i]) {
                valid[i+1] = true;
            }
        }
        if (trans[i] == 4) {
            if (last != 2 and last != 4) {
                ans += count*(count+1)/2;
                count=0;
            }
            if ((last == 2 or last == 4) and valid[i]) {
                valid[i+1] = true;
            }
        }
        if (trans[i] == 5) {
            ans += count*(count+1)/2;
            count=0;
            valid[i] = false;
        }
        last = trans[i];
    }
    ans += count*(count+1)/2;
    cout << ans << endl;
}