// PA 2024 3C - Dodawanie
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
enum State { OK, START, CONT, END, NOTHING };
long long ctoll(char c) {
return (int)c - 48;
}
int main()
{
ios_base::sync_with_stdio(0);
string a, b, c;
long long n, a1, b1, c1, result, curr;
State prev;
vector<State> states;
cin >> a;
cin >> b;
cin >> c;
n = a.length();
result = 0;
for (long long i = 0; i < n; ++i) {
a1 = ctoll(a[i]);
b1 = ctoll(b[i]);
c1 = ctoll(c[i]);
if (a1 + b1 == c1) {
states.push_back(OK);
} else if (a1 + b1 == c1 + 10) {
states.push_back(START);
} else if (a1 + b1 + 1 == c1) {
states.push_back(END);
} else if (a1 + b1 + 1 == c1 + 10) {
states.push_back(CONT);
} else {
states.push_back(NOTHING);
}
// cout << states[i];
}
// cout << endl;
curr = 0;
prev = NOTHING;
for (long long i = n - 1; i >= 0; --i) {
// cout << i << " prev: " << prev << endl;
if (prev == START) {
switch(states[i]) {
case CONT:
break;
case END:
++curr;
prev = states[i];
break;
default:
// for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << i + 1 << " " << i + 1 << endl;
result += ((curr + 1) * curr) / 2;
curr = 0;
prev = states[i];
}
if (states[i] == OK) {
++curr;
}
} else {
switch(states[i]) {
case OK:
++curr;
prev = states[i];
break;
case START:
prev = states[i];
break;
default:
// for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << i + 1 << " " << i + 1 << endl;
result += ((curr + 1) * curr) / 2;
curr = 0;
prev = states[i];
}
}
}
// for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << 0 << " " << 0 << endl;
result += ((curr + 1) * curr) / 2;
cout << result << 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 | // PA 2024 3C - Dodawanie #include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; enum State { OK, START, CONT, END, NOTHING }; long long ctoll(char c) { return (int)c - 48; } int main() { ios_base::sync_with_stdio(0); string a, b, c; long long n, a1, b1, c1, result, curr; State prev; vector<State> states; cin >> a; cin >> b; cin >> c; n = a.length(); result = 0; for (long long i = 0; i < n; ++i) { a1 = ctoll(a[i]); b1 = ctoll(b[i]); c1 = ctoll(c[i]); if (a1 + b1 == c1) { states.push_back(OK); } else if (a1 + b1 == c1 + 10) { states.push_back(START); } else if (a1 + b1 + 1 == c1) { states.push_back(END); } else if (a1 + b1 + 1 == c1 + 10) { states.push_back(CONT); } else { states.push_back(NOTHING); } // cout << states[i]; } // cout << endl; curr = 0; prev = NOTHING; for (long long i = n - 1; i >= 0; --i) { // cout << i << " prev: " << prev << endl; if (prev == START) { switch(states[i]) { case CONT: break; case END: ++curr; prev = states[i]; break; default: // for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << i + 1 << " " << i + 1 << endl; result += ((curr + 1) * curr) / 2; curr = 0; prev = states[i]; } if (states[i] == OK) { ++curr; } } else { switch(states[i]) { case OK: ++curr; prev = states[i]; break; case START: prev = states[i]; break; default: // for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << i + 1 << " " << i + 1 << endl; result += ((curr + 1) * curr) / 2; curr = 0; prev = states[i]; } } } // for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << 0 << " " << 0 << endl; result += ((curr + 1) * curr) / 2; cout << result << endl; return 0; } |
English