#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> char buf1[1000050]; char buf2[1000050]; void readn(char* tab, int& n) { scanf("%s", tab); char* p = tab; while (*p) { *p -= '0'; p++; } n = (int) (p - tab); *p = -1; } void debugprint(char* tab, int n, int& zerostart, int& zeroend) { if (zeroend > zerostart) memset(&tab[zerostart], 0, zeroend - zerostart); zerostart = -1; zeroend = -1; for (int j = 0; j < n; j++) putchar(tab[j] + '0'); printf("\n"); } #define debugprint(...) int main() { //freopen("/home/paul/Documents/cpp/algo/blah/.test/test.txt", "r", stdin); int n; scanf("%i", &n); char* cur = buf1; int curn; char* last = buf2; int lastn = 0; int lastzerostart = -1, lastzeroend = -1; long long int res = 0; readn(last, lastn); for (int i = 1; i < n; i++) { debugprint(last, lastn, lastzerostart, lastzeroend); readn(cur, curn); if (curn > lastn) { std::swap(last, cur); lastn = curn; lastzerostart = lastzeroend = -1; continue; } int j = 0; while (true) { if (j >= lastzerostart && j < lastzeroend) { last[j] = 0; ++lastzeroend; } if (cur[j] != last[j] || cur[j] == -1) break; j++; } int add_zeros = 0; if (cur[j] == -1) { // try to increment last one bool success = false; for (int k = lastn - 1; k >= j; --k) { if (k >= lastzerostart && k < lastzeroend) { last[k] = 0; --lastzeroend; } if (last[k] == 9) { last[k] = 0; continue; } last[k]++; success = true; break; } if (success) { // we succeeded! - we only need to add the amount of digits res += lastn - j; continue; } else { // we failed, we'll need to zero pad+1 add_zeros = 1; } } if (cur[j] < last[j]) { add_zeros = 1; } // just zero-pad it std::swap(last, cur); lastn += add_zeros; lastzerostart = curn; lastzeroend = lastn; res += lastn - curn; } debugprint(last, lastn, lastzerostart, lastzeroend); printf("%lli\n", res); 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 | #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> char buf1[1000050]; char buf2[1000050]; void readn(char* tab, int& n) { scanf("%s", tab); char* p = tab; while (*p) { *p -= '0'; p++; } n = (int) (p - tab); *p = -1; } void debugprint(char* tab, int n, int& zerostart, int& zeroend) { if (zeroend > zerostart) memset(&tab[zerostart], 0, zeroend - zerostart); zerostart = -1; zeroend = -1; for (int j = 0; j < n; j++) putchar(tab[j] + '0'); printf("\n"); } #define debugprint(...) int main() { //freopen("/home/paul/Documents/cpp/algo/blah/.test/test.txt", "r", stdin); int n; scanf("%i", &n); char* cur = buf1; int curn; char* last = buf2; int lastn = 0; int lastzerostart = -1, lastzeroend = -1; long long int res = 0; readn(last, lastn); for (int i = 1; i < n; i++) { debugprint(last, lastn, lastzerostart, lastzeroend); readn(cur, curn); if (curn > lastn) { std::swap(last, cur); lastn = curn; lastzerostart = lastzeroend = -1; continue; } int j = 0; while (true) { if (j >= lastzerostart && j < lastzeroend) { last[j] = 0; ++lastzeroend; } if (cur[j] != last[j] || cur[j] == -1) break; j++; } int add_zeros = 0; if (cur[j] == -1) { // try to increment last one bool success = false; for (int k = lastn - 1; k >= j; --k) { if (k >= lastzerostart && k < lastzeroend) { last[k] = 0; --lastzeroend; } if (last[k] == 9) { last[k] = 0; continue; } last[k]++; success = true; break; } if (success) { // we succeeded! - we only need to add the amount of digits res += lastn - j; continue; } else { // we failed, we'll need to zero pad+1 add_zeros = 1; } } if (cur[j] < last[j]) { add_zeros = 1; } // just zero-pad it std::swap(last, cur); lastn += add_zeros; lastzerostart = curn; lastzeroend = lastn; res += lastn - curn; } debugprint(last, lastn, lastzerostart, lastzeroend); printf("%lli\n", res); return 0; } |