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
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <cmath>

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    std::string linia1;
    std::string linia2;
    std::string suma;
    std::cin >> linia1;
    std::cin >> linia2;
    std::cin >> suma;
    std::reverse(linia1.begin(), linia1.end());
    std::reverse(linia2.begin(), linia2.end());
    std::reverse(suma.begin(), suma.end());
    for (int i = 0; i < linia1.size(); ++i)
    {
        linia1[i] -= '0';
        linia2[i] -= '0';
        suma[i] -= '0';
    }
    long long ileElementowWGrupie = 0;
    long long wynik = 0;

    int n = linia1.size();
    for (int i = n - 1; i >= 0; --i)
    {
        if (linia1[i] + linia2[i] == suma[i])
        {
            ileElementowWGrupie++;
            continue;
        }
        if (linia1[i] + linia2[i] + 1 == suma[i])
        {
            while (i >= 0)
            {
                i--;
                if (linia1[i] + linia2[i] + 1 != 10 + suma[i])
                    break;
            }
            if (i>=0 && linia1[i] + linia2[i] == 10 + suma[i])
            {
                ileElementowWGrupie++;
                continue;
            }
            else
            {
                i++;
                wynik += ileElementowWGrupie * (ileElementowWGrupie + 1) / 2;
                ileElementowWGrupie = 0;
            }
        }
        wynik += ileElementowWGrupie * (ileElementowWGrupie + 1) / 2;
        ileElementowWGrupie = 0;
    }

    wynik += ileElementowWGrupie * (ileElementowWGrupie + 1) / 2;
    std::cout << wynik << "\n";

    return 0;
}