#include <bits/stdc++.h>
using namespace std;
string s1, s2, s3;
int n;
long long wzorek(long long x) {
if(x <= 0) return 0;
return ((x*x + x)/2);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> s1 >> s2 >> s3;
n = s1.size();
vector<int> a(n), b(n), c(n), reszta(n + 1, 0), pref(n + 1, 0);
vector<int> querySajz(n + 1, 0);
for(int i = 0; i < n; i++) {
a[i] = s1[i] - '0';
b[i] = s2[i] - '0';
c[i] = s3[i] - '0';
}
for(int i = n - 1; i >= 0; i--) {
if(a[i] + b[i] == c[i]){ // Przedzial [i, i]
querySajz[i] = 1;
reszta[i] = 0;
}
else if(a[i] + b[i] - 10 == c[i]) { // Przedzial [i, i] -> [i - 1, i]
querySajz[i] = -1;
// cout << " i " << i << '\n';
reszta[i] = 1;
}
else if(reszta[i + 1] > 0 && a[i] + b[i] + reszta[i + 1] == c[i]) {
querySajz[i] = (-1)*(querySajz[i + 1] - 1);
reszta[i] = 0;
}
else if(reszta[i + 1] > 0 && a[i] + b[i] - 10 + reszta[i + 1] == c[i]) {
querySajz[i] = querySajz[i + 1] - 1;
reszta[i] = 1;
}
}
// for(int i = 0; i < n; i++){
// // cout << i << " " << querySajz[i] << " " << reszta[i] << '\n';
// cout << querySajz[i] << " ";
// }
long long licz, res;
res = licz = 0;
for(int i = 0; i <= n; i++) {
// cout << i << '\n';
if(querySajz[i] > 0) {
licz++;
i += querySajz[i] - 1;
continue;
}
else {
// cout << '\n' << i << " " << licz << '\n';
res += wzorek(licz);
licz = 0;
}
}
cout << res << '\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 | #include <bits/stdc++.h> using namespace std; string s1, s2, s3; int n; long long wzorek(long long x) { if(x <= 0) return 0; return ((x*x + x)/2); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> s1 >> s2 >> s3; n = s1.size(); vector<int> a(n), b(n), c(n), reszta(n + 1, 0), pref(n + 1, 0); vector<int> querySajz(n + 1, 0); for(int i = 0; i < n; i++) { a[i] = s1[i] - '0'; b[i] = s2[i] - '0'; c[i] = s3[i] - '0'; } for(int i = n - 1; i >= 0; i--) { if(a[i] + b[i] == c[i]){ // Przedzial [i, i] querySajz[i] = 1; reszta[i] = 0; } else if(a[i] + b[i] - 10 == c[i]) { // Przedzial [i, i] -> [i - 1, i] querySajz[i] = -1; // cout << " i " << i << '\n'; reszta[i] = 1; } else if(reszta[i + 1] > 0 && a[i] + b[i] + reszta[i + 1] == c[i]) { querySajz[i] = (-1)*(querySajz[i + 1] - 1); reszta[i] = 0; } else if(reszta[i + 1] > 0 && a[i] + b[i] - 10 + reszta[i + 1] == c[i]) { querySajz[i] = querySajz[i + 1] - 1; reszta[i] = 1; } } // for(int i = 0; i < n; i++){ // // cout << i << " " << querySajz[i] << " " << reszta[i] << '\n'; // cout << querySajz[i] << " "; // } long long licz, res; res = licz = 0; for(int i = 0; i <= n; i++) { // cout << i << '\n'; if(querySajz[i] > 0) { licz++; i += querySajz[i] - 1; continue; } else { // cout << '\n' << i << " " << licz << '\n'; res += wzorek(licz); licz = 0; } } cout << res << '\n'; } |
English