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
#include <bits/stdc++.h>
using namespace std;

string s1, s2, s3;
int n;

long long wzorek(long long x) {
    if(x <= 0) return 0;
    return ((x*x + x)/2);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> s1 >> s2 >> s3;
    n = s1.size();
    vector<int> a(n), b(n), c(n), reszta(n + 1, 0), pref(n + 1, 0);
    vector<int> querySajz(n + 1, 0);
    for(int i = 0; i < n; i++) {
        a[i] = s1[i] - '0';
        b[i] = s2[i] - '0';
        c[i] = s3[i] - '0';
    }
    
    for(int i = n - 1; i >= 0; i--) {
        if(a[i] + b[i] == c[i]){ // Przedzial [i, i]
            querySajz[i] = 1;
            reszta[i] = 0;
        }
        else if(a[i] + b[i] - 10 == c[i]) { // Przedzial [i, i]  ->  [i - 1, i]
            querySajz[i] = -1;
            // cout << " i " << i << '\n';
            reszta[i] = 1;
        }
        else if(reszta[i + 1] > 0 && a[i] + b[i] + reszta[i + 1] == c[i]) {
            querySajz[i] = (-1)*(querySajz[i + 1] - 1);
            reszta[i] = 0;
        }
        else if(reszta[i + 1] > 0 && a[i] + b[i] - 10 + reszta[i + 1] == c[i]) {
            querySajz[i] = querySajz[i + 1] - 1;
            reszta[i] = 1;
        }
    }
    // for(int i = 0; i < n; i++){
    //     // cout << i << " " << querySajz[i] << " " << reszta[i] << '\n';
    //     cout << querySajz[i] << " ";
    // }

    long long licz, res;
    res = licz = 0;

    for(int i = 0; i <= n; i++) {
        // cout << i << '\n';
        if(querySajz[i] > 0) {
            licz++;
            i += querySajz[i] - 1;
            continue;
        }
        else {
            // cout << '\n' << i << " " << licz << '\n';
            res += wzorek(licz);
            licz = 0;
        }
    }
    cout << res << '\n';

}