#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
string as, bs, rs;
cin >> as >> bs >> rs;
vector<int> mniejZnaczace, bardziejZnaczace;
bool carry = false;
int wynik = 0;
reverse(as.begin(), as.end());
reverse(bs.begin(), bs.end());
reverse(rs.begin(), rs.end());
as.push_back('0');
bs.push_back('0');
rs.push_back('6');
for (int i = 0; i < as.size(); i++) {
int a, b, r;
a = as[i] - '0';
b = bs[i] - '0';
r = rs[i] - '0';
if ((a + b + carry) % 10 != r) {
if (!bardziejZnaczace.empty()) {
int nbzi = 0;
for (int i = 0; i < mniejZnaczace.size(); i++) {
while (nbzi < bardziejZnaczace.size() && mniejZnaczace[i] > bardziejZnaczace[nbzi]) {
nbzi++;
}
wynik += max((int) bardziejZnaczace.size() - nbzi, 0);
}
}
carry = false;
bardziejZnaczace.clear();
mniejZnaczace.clear();
continue;
}
if (!carry) {
mniejZnaczace.push_back(i);
}
if (a + b + carry >= 10) {
if ((as[i + 1] + bs[i + 1] - '0' - '0') % 10 == rs[i + 1] - '0') {
carry = false;
if (!bardziejZnaczace.empty()) {
int nbzi = 0;
for (int i = 0; i < mniejZnaczace.size(); i++) {
while (mniejZnaczace[i] > bardziejZnaczace[nbzi]) {
nbzi++;
}
wynik += max((int)bardziejZnaczace.size() - nbzi, 0);
}
}
carry = false;
bardziejZnaczace.clear();
mniejZnaczace.clear();
continue;
}
else {
carry = true;
}
}
else {
carry = false;
bardziejZnaczace.push_back(i);
}
}
if (!bardziejZnaczace.empty()) {
int nbzi = 0;
for (int i = 0; i < mniejZnaczace.size(); i++) {
while (mniejZnaczace[i] > bardziejZnaczace[nbzi]) {
nbzi++;
}
wynik += max((int)bardziejZnaczace.size() - nbzi, 0);
}
}
cout << wynik;
}
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 | #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); string as, bs, rs; cin >> as >> bs >> rs; vector<int> mniejZnaczace, bardziejZnaczace; bool carry = false; int wynik = 0; reverse(as.begin(), as.end()); reverse(bs.begin(), bs.end()); reverse(rs.begin(), rs.end()); as.push_back('0'); bs.push_back('0'); rs.push_back('6'); for (int i = 0; i < as.size(); i++) { int a, b, r; a = as[i] - '0'; b = bs[i] - '0'; r = rs[i] - '0'; if ((a + b + carry) % 10 != r) { if (!bardziejZnaczace.empty()) { int nbzi = 0; for (int i = 0; i < mniejZnaczace.size(); i++) { while (nbzi < bardziejZnaczace.size() && mniejZnaczace[i] > bardziejZnaczace[nbzi]) { nbzi++; } wynik += max((int) bardziejZnaczace.size() - nbzi, 0); } } carry = false; bardziejZnaczace.clear(); mniejZnaczace.clear(); continue; } if (!carry) { mniejZnaczace.push_back(i); } if (a + b + carry >= 10) { if ((as[i + 1] + bs[i + 1] - '0' - '0') % 10 == rs[i + 1] - '0') { carry = false; if (!bardziejZnaczace.empty()) { int nbzi = 0; for (int i = 0; i < mniejZnaczace.size(); i++) { while (mniejZnaczace[i] > bardziejZnaczace[nbzi]) { nbzi++; } wynik += max((int)bardziejZnaczace.size() - nbzi, 0); } } carry = false; bardziejZnaczace.clear(); mniejZnaczace.clear(); continue; } else { carry = true; } } else { carry = false; bardziejZnaczace.push_back(i); } } if (!bardziejZnaczace.empty()) { int nbzi = 0; for (int i = 0; i < mniejZnaczace.size(); i++) { while (mniejZnaczace[i] > bardziejZnaczace[nbzi]) { nbzi++; } wynik += max((int)bardziejZnaczace.size() - nbzi, 0); } } cout << wynik; } |
English