#include <cstdio>
#include <cstring>
#include <algorithm>
#define DBG(...) fprintf(stderr, __VA_ARGS__)
typedef unsigned I;
typedef unsigned long long L;
static const I TL = 16;
struct S {
I len;
char txt[TL];
bool operator<(const S& r) const {
if (len < r.len)
return true;
if (len > r.len)
return false;
for (I i=0; i<len; ++i) {
if (i >= TL)
return false;
if (txt[i] < r.txt[i])
return true;
if (txt[i] > r.txt[i])
return false;
}
return false;
}
bool caninc(const S& s) const {
if (len == s.len)
return false;
if (0 != memcmp(txt, s.txt, len > TL ? TL : len))
return false;
for (I i=len; i<s.len; ++i) {
if (i >= TL)
return true;
if (s.txt[i] != '9')
return true;
}
return false;
}
S inc() const {
S ret = *this;
if (ret.len > TL)
return ret;
I i = ret.len - 1;
for (;;) {
if (ret.txt[i] != '9') {
ret.txt[i] ++;
break;
}
ret.txt[i--] = '0';
}
return ret;
}
void app0(I cnt) {
for (I i=0; i<cnt; ++i) {
if (len + i >= TL)
break;
txt[len + i] = '0';
}
len += cnt;
}
S ext(const S& s) const {
S ret = *this;
if (ret.len == s.len) {
ret.app0(1);
} else {
ret.app0(s.len - ret.len);
if (ret < s)
ret.app0(1);
}
return ret;
}
};
static inline S calc(const S& cur, const S& last) {
if (last < cur)
return cur;
if (cur.caninc(last))
return last.inc();
return cur.ext(last);
}
int main() {
I N;
scanf("%u\n", &N);
L ret = 0;
S last;
last.len = 0;
for (I n = 0; n < N; ++n) {
S cur;
scanf("%s\n", cur.txt);
cur.len = strlen(cur.txt);
last = calc(cur, last);
ret += last.len - cur.len;
}
printf("%llu\n", ret);
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 103 104 105 106 107 | #include <cstdio> #include <cstring> #include <algorithm> #define DBG(...) fprintf(stderr, __VA_ARGS__) typedef unsigned I; typedef unsigned long long L; static const I TL = 16; struct S { I len; char txt[TL]; bool operator<(const S& r) const { if (len < r.len) return true; if (len > r.len) return false; for (I i=0; i<len; ++i) { if (i >= TL) return false; if (txt[i] < r.txt[i]) return true; if (txt[i] > r.txt[i]) return false; } return false; } bool caninc(const S& s) const { if (len == s.len) return false; if (0 != memcmp(txt, s.txt, len > TL ? TL : len)) return false; for (I i=len; i<s.len; ++i) { if (i >= TL) return true; if (s.txt[i] != '9') return true; } return false; } S inc() const { S ret = *this; if (ret.len > TL) return ret; I i = ret.len - 1; for (;;) { if (ret.txt[i] != '9') { ret.txt[i] ++; break; } ret.txt[i--] = '0'; } return ret; } void app0(I cnt) { for (I i=0; i<cnt; ++i) { if (len + i >= TL) break; txt[len + i] = '0'; } len += cnt; } S ext(const S& s) const { S ret = *this; if (ret.len == s.len) { ret.app0(1); } else { ret.app0(s.len - ret.len); if (ret < s) ret.app0(1); } return ret; } }; static inline S calc(const S& cur, const S& last) { if (last < cur) return cur; if (cur.caninc(last)) return last.inc(); return cur.ext(last); } int main() { I N; scanf("%u\n", &N); L ret = 0; S last; last.len = 0; for (I n = 0; n < N; ++n) { S cur; scanf("%s\n", cur.txt); cur.len = strlen(cur.txt); last = calc(cur, last); ret += last.len - cur.len; } printf("%llu\n", ret); return 0; } |
English