#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;
}
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; } |
English