#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
string up_str, down_str, equal_str;
cin >> up_str >> down_str >> equal_str;
int n = (int)up_str.size();
vector<int> up(n), down(n), equal(n);
for(int i = 0; i < n; ++i) {
up[i] = up_str[i] - '0';
down[i] = down_str[i] - '0';
equal[i] = equal_str[i] - '0';
}
bool found = false;
int last_open = -1;
int last_end = -1;
vector<bool> plus(n);
vector<pair<int, int>> blocks;
for(int i = n - 1; i >= 0; --i) {
int sum = up[i] + down[i];
if(found == false) {
if((sum == equal[i]) || (sum - 10 == equal[i])) {
found = true;
last_open = i;
if(sum >= 10) {
plus[i] = true;
}
else {
last_end = i;
}
}
}
else {
if((sum + plus[i + 1] == equal[i]) || (sum + plus[i + 1] - 10 == equal[i])) {
if(sum + plus[i + 1] >= 10) {
plus[i] = true;
}
else {
last_end = i;
}
}
else {
if(last_end != -1) {
blocks.push_back({last_end, last_open});
}
found = false;
last_end = -1;
last_open = -1;
i++;
}
}
}
if(found == true) {
if(last_end != -1) {
blocks.push_back({last_end, last_open});
}
}
int sz = blocks.size();
ll ans = 0;
for(int block_idx = 0; block_idx < sz; ++block_idx) {
int bl_end = blocks[block_idx].first;
int bl_start = blocks[block_idx].second;
vector<int> starty, konce;
starty.push_back(bl_start);
for(int i = bl_start - 1; i >= bl_end; --i) {
if(plus[i + 1] == false) {
starty.push_back(i);
}
}
for(int i = bl_start; i >= bl_end; --i) {
if(plus[i] == false) {
konce.push_back(i);
}
}
reverse(starty.begin(), starty.end());
unordered_map<int, int> amnt_big;
for(int i = 0; i < (int)starty.size(); ++i) {
int cur_amnt = (int)starty.size() - i;
amnt_big.insert({starty[i], cur_amnt});
}
ll cnt = 0;
for(int i = 0; i < (int)konce.size(); ++i) {
auto it = lower_bound(starty.begin(), starty.end(), konce[i]);
int idx = *it;
ll cur_amnt_bigger = amnt_big[idx];
cnt += cur_amnt_bigger;
}
ans += cnt;
}
cout << ans << '\n';
}
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 98 99 100 101 102 103 104 105 106 107 108 109 | #include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios_base::sync_with_stdio(false); cin.tie(0); string up_str, down_str, equal_str; cin >> up_str >> down_str >> equal_str; int n = (int)up_str.size(); vector<int> up(n), down(n), equal(n); for(int i = 0; i < n; ++i) { up[i] = up_str[i] - '0'; down[i] = down_str[i] - '0'; equal[i] = equal_str[i] - '0'; } bool found = false; int last_open = -1; int last_end = -1; vector<bool> plus(n); vector<pair<int, int>> blocks; for(int i = n - 1; i >= 0; --i) { int sum = up[i] + down[i]; if(found == false) { if((sum == equal[i]) || (sum - 10 == equal[i])) { found = true; last_open = i; if(sum >= 10) { plus[i] = true; } else { last_end = i; } } } else { if((sum + plus[i + 1] == equal[i]) || (sum + plus[i + 1] - 10 == equal[i])) { if(sum + plus[i + 1] >= 10) { plus[i] = true; } else { last_end = i; } } else { if(last_end != -1) { blocks.push_back({last_end, last_open}); } found = false; last_end = -1; last_open = -1; i++; } } } if(found == true) { if(last_end != -1) { blocks.push_back({last_end, last_open}); } } int sz = blocks.size(); ll ans = 0; for(int block_idx = 0; block_idx < sz; ++block_idx) { int bl_end = blocks[block_idx].first; int bl_start = blocks[block_idx].second; vector<int> starty, konce; starty.push_back(bl_start); for(int i = bl_start - 1; i >= bl_end; --i) { if(plus[i + 1] == false) { starty.push_back(i); } } for(int i = bl_start; i >= bl_end; --i) { if(plus[i] == false) { konce.push_back(i); } } reverse(starty.begin(), starty.end()); unordered_map<int, int> amnt_big; for(int i = 0; i < (int)starty.size(); ++i) { int cur_amnt = (int)starty.size() - i; amnt_big.insert({starty[i], cur_amnt}); } ll cnt = 0; for(int i = 0; i < (int)konce.size(); ++i) { auto it = lower_bound(starty.begin(), starty.end(), konce[i]); int idx = *it; ll cur_amnt_bigger = amnt_big[idx]; cnt += cur_amnt_bigger; } ans += cnt; } cout << ans << '\n'; } |
English