#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; } |