#include <cassert>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define FOR(i, n) for(int i = 0, __n = n; i < __n; i++)
const int MAXN = 1000*1000;
const int MAXM = 12;
struct num {
char t[MAXN];
int len;
int constants;
int variables;
num(): len(0), constants(0), variables(0) {
}
void clear() {
for (int i = 0; i < constants; i++) {
t[i] = '0';
}
constants = 0;
for (int i = len - variables; i < len; i++) {
t[i] = '0';
}
variables = 0;
}
void replaceWithNo(const char * c) {
int clen = strlen(c);
clear();
FOR(i, clen) t[i] = c[i];
constants = clen;
}
int setNo(const char * c) {
int clen = strlen(c);
if (clen > len) {
strcpy(t, c);
constants = len = clen;
variables = 0;
return 0;
}
for (int i = 0; i < clen; i++) {
if (c[i] > t[i]) {
// cyfry nowej liczby są większe niz wiodące cyfry starej liczby
// podmieniamy początek, resztę zerujemy
replaceWithNo(c);
return len - clen;
} else if (c[i] < t[i]) {
// cyfry nowej liczby są mniejsze niz wiodące cyfry starej liczby
// podmieniamy początek, resztę zerujemy, dodajemy jedno zero
replaceWithNo(c);
t[len++] = '0';
return len - clen;
}
}
// cyfry nowej liczby idealnie pokrywają się z wiodącymi cyframi starej liczby
// próbujemy zwiększyć liczbę o jeden.
int j = len - 1;
while (j >= clen) {
if (t[j] == '9') {
t[j] = '0';
j--;
} else {
t[j]++;
variables = max(variables, len - j);
constants = max(constants, clen);
return len-clen;
}
}
// nie udało się zwiększyć o jeden. Przepisujemy i dodajemy jedno zero
replaceWithNo(c);
t[len++] = '0';
return len - clen;
}
} N;
char l[MAXM];
int main() {
ios_base::sync_with_stdio(0);
long long n;
cin >> n;
int ones = 0;
long long sum = 0;
for (int i = 0; i < n; i++) {
cin >> l;
sum += N.setNo(l);
// cerr << N.t << endl;
}
cout << sum << 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 98 99 100 101 102 | #include <cassert> #include <iostream> #include <cstring> #include <algorithm> using namespace std; #define FOR(i, n) for(int i = 0, __n = n; i < __n; i++) const int MAXN = 1000*1000; const int MAXM = 12; struct num { char t[MAXN]; int len; int constants; int variables; num(): len(0), constants(0), variables(0) { } void clear() { for (int i = 0; i < constants; i++) { t[i] = '0'; } constants = 0; for (int i = len - variables; i < len; i++) { t[i] = '0'; } variables = 0; } void replaceWithNo(const char * c) { int clen = strlen(c); clear(); FOR(i, clen) t[i] = c[i]; constants = clen; } int setNo(const char * c) { int clen = strlen(c); if (clen > len) { strcpy(t, c); constants = len = clen; variables = 0; return 0; } for (int i = 0; i < clen; i++) { if (c[i] > t[i]) { // cyfry nowej liczby są większe niz wiodące cyfry starej liczby // podmieniamy początek, resztę zerujemy replaceWithNo(c); return len - clen; } else if (c[i] < t[i]) { // cyfry nowej liczby są mniejsze niz wiodące cyfry starej liczby // podmieniamy początek, resztę zerujemy, dodajemy jedno zero replaceWithNo(c); t[len++] = '0'; return len - clen; } } // cyfry nowej liczby idealnie pokrywają się z wiodącymi cyframi starej liczby // próbujemy zwiększyć liczbę o jeden. int j = len - 1; while (j >= clen) { if (t[j] == '9') { t[j] = '0'; j--; } else { t[j]++; variables = max(variables, len - j); constants = max(constants, clen); return len-clen; } } // nie udało się zwiększyć o jeden. Przepisujemy i dodajemy jedno zero replaceWithNo(c); t[len++] = '0'; return len - clen; } } N; char l[MAXM]; int main() { ios_base::sync_with_stdio(0); long long n; cin >> n; int ones = 0; long long sum = 0; for (int i = 0; i < n; i++) { cin >> l; sum += N.setNo(l); // cerr << N.t << endl; } cout << sum << endl; return 0; } |
English