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
// Zadanie Dodawanie
// Potyczki algorytmiczne 2026
#include <iostream>
#include <string>
using namespace std;

int main()
{
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(NULL); 
  int npairs = 0;
  string as, bs, cs;
  cin >> as >> bs >> cs;
  int len = as.length();
  // xx[i] = j oznacza, źe dla k od i do j cyfry z pozycji k w obu liczbach dają
  // wynik jednocyfrowy i zgodny z tym w trzeciej liczbie
  // xx[i] = -1 w przec. razie
  // taka heurystyka.
  int i;
  int *xx = new int[len];
  int v = -1;
  for (int i = len - 1; i >= 0; i--)
  {
    int d = as[i] - '0' + bs[i] - '0';
    if (d < 10 && d == cs[i] - '0')
    {
      if (v == -1)
        v = i;
    }
    else
      v = -1;
    xx[i] = v;
  }

  for (int i = 0; i < len; i++)
  {
    for (int j = i; j < len; j++)
    {
      if (xx[i] == -1 || j > xx[i]) // (i, j) nie jest w przedziale wyników 1-cyfr. 
      { 
        // Mozolne dodawanie.
        int carry = 0;
        int k;
        for (k = j; k >= i; k--)
        {
          int c = as[k] - '0' + bs[k] - '0' + carry;
          if (c > 9)
          { 
            c -= 10;
            carry = 1;
          }
          else
            carry = 0;
          if (c != cs[k] - '0')
            break;
        }
        if (k < i && carry == 0)   
          npairs++;
      }
      else // Ominięcie
        npairs++;
    }
  }  
  delete [] xx;
  
  cout << npairs << endl;
  // system("pause"); 
}