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 <cstdint>
#include <cstdio>
#include <cstring>

constexpr auto MAX = 1000001;

uint64_t permutations(uint64_t n) { return n * (n + 1) / 2; }

int getShiftSegment(const int n, int i, const char* a, const char* b, const char* c) {
  int shift = 1;
  int length = 1;
  i--;
  while (0 <= i) {
    if (a[i] + b[i] + shift == c[i] + 10) {
      length++;
      i--;
    } else if (a[i] + b[i] + shift == c[i]) {
      return length + 1;
    } else {
      return -1;
    }
  }
  return -1;
}

uint64_t count(const int n, const char* a, const char* b, const char* c) {
  uint64_t sum = 0;
  int length = 0;
  int i = n - 1;

  while (0 <= i) {
    if (a[i] + b[i] == c[i]) {
      length++;
    } else if (a[i] + b[i] == c[i] + 10) {
      const int shiftSegment = getShiftSegment(n, i, a, b, c);
      if (0 < shiftSegment) {
        length++;
        i -= shiftSegment - 1;
      } else {
        sum += permutations(length);
        length = 0;
      }
    } else {
      sum += permutations(length);
      length = 0;
    }
    i--;
  }
  sum += permutations(length);
  return sum;
}

int main() {
  char a[MAX], b[MAX], c[MAX];
  scanf("%s", a);
  scanf("%s", b);
  scanf("%s", c);
  const int n = strlen(a);
  for (int i = 0; i < n; ++i) {
    a[i] -= '0';
    b[i] -= '0';
    c[i] -= '0';
  }
  printf("%lu\n", count(n, a, b, c));
  return 0;
}