#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define sn second
typedef long long ll;
typedef vector<int> VI;
typedef vector<char> VC;
typedef pair<int, int> PI;
int main() {
string a, b, c;
cin >> a >> b >> c;
int n = a.size();
VI A(n);
VI B(n);
VI C(n);
vector<PI> intervals;
bool open = false;
int overflow = 0;
int beg = -1;
for (int i = n - 1; i >= 0; i--) {
A[i] = a[i] - '0';
B[i] = b[i] - '0';
C[i] = c[i] - '0';
int sum = A[i] + B[i];
if (open) {
if (C[i] == sum + overflow) {
intervals.pb(make_pair(i, beg));
open = false;
overflow = 0;
beg = -1;
}
else if (C[i] == (sum + overflow) % 10) {
overflow = (sum + overflow) / 10;
}
else {
open = false;
overflow = 0;
beg = -1;
}
}
if (C[i] == sum) {
intervals.pb(make_pair(i, i));
open = false;
overflow = 0;
beg = -1;
}
else if (C[i] == sum % 10) {
open = true;
overflow = sum / 10;
beg = i;
}
}
#ifdef DEBUG
for (int i = 0; i < intervals.size(); i++) {
cout << intervals[i].first << " " << intervals[i].second << endl;
}
#endif
reverse(intervals.begin(), intervals.end());
ll res = 0;
int m = intervals.size();
int len = 0;
for (int i = m - 1; i >= 0; i--) {
if (i + 1 < m && intervals[i].second + 1 == intervals[i + 1].first) {
len++;
}
else {
len = 1;
}
res += len;
}
cout << res << endl;
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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include <bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define sn second typedef long long ll; typedef vector<int> VI; typedef vector<char> VC; typedef pair<int, int> PI; int main() { string a, b, c; cin >> a >> b >> c; int n = a.size(); VI A(n); VI B(n); VI C(n); vector<PI> intervals; bool open = false; int overflow = 0; int beg = -1; for (int i = n - 1; i >= 0; i--) { A[i] = a[i] - '0'; B[i] = b[i] - '0'; C[i] = c[i] - '0'; int sum = A[i] + B[i]; if (open) { if (C[i] == sum + overflow) { intervals.pb(make_pair(i, beg)); open = false; overflow = 0; beg = -1; } else if (C[i] == (sum + overflow) % 10) { overflow = (sum + overflow) / 10; } else { open = false; overflow = 0; beg = -1; } } if (C[i] == sum) { intervals.pb(make_pair(i, i)); open = false; overflow = 0; beg = -1; } else if (C[i] == sum % 10) { open = true; overflow = sum / 10; beg = i; } } #ifdef DEBUG for (int i = 0; i < intervals.size(); i++) { cout << intervals[i].first << " " << intervals[i].second << endl; } #endif reverse(intervals.begin(), intervals.end()); ll res = 0; int m = intervals.size(); int len = 0; for (int i = m - 1; i >= 0; i--) { if (i + 1 < m && intervals[i].second + 1 == intervals[i + 1].first) { len++; } else { len = 1; } res += len; } cout << res << endl; return 0; } |
English