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
#include <bits/stdc++.h>
#include <unordered_map>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef vector<vi> vvi;
typedef vector<bool> vb;

#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define loop(i,a,b) for (int (i) = (a); (i) < b; (i)++)
#define rloop(i,a,b) for (int (i) = (a); (i) >= b; (i)--)

int main()
{
    cin.tie(0)->sync_with_stdio(false);

    string a, b, c;
    cin >> a >> b >> c;

    int n = a.size();

    vector<short> potrzPrz(n, -1), przeniesienie(n, -1);

    loop(i, 0, n)
    {
        int aC = a[i] - '0', bC = b[i] - '0', cC = c[i] - '0';

        if ((aC + bC) % 10 == cC)
            potrzPrz[i] = 0, przeniesienie[i] = (aC + bC) / 10;
        else if ((aC+bC+1)%10==cC)
            potrzPrz[i] = 1, przeniesienie[i] = (aC + bC + 1) / 10;
    }

    int l = 0, r;
    ll res = 0ll, pop;

    while (l < n)
    {
        if (potrzPrz[l] == -1) { l++; continue; }

        r = l;
        pop = 0ll;

        while (r < n)
        {
            if(potrzPrz[r] == -1 || (l!=r && przeniesienie[r]!=potrzPrz[r-1]))
                break;

            if (przeniesienie[r] == 0) pop++;
            if (potrzPrz[r] == 0) res += pop;

            r++;
        }
        l = r;
    }

    cout << res;
    return 0;
}