#include <iostream>
using namespace std;
int compare(const string &a, const string &b) {
if (a.size() > b.size()) {
return 1;
}
if (a.size() < b.size()) {
return -1;
}
for (int i = 0; i < a.size(); i++) {
if (a[i] != b[i]) {
return a[i] - b[i];
}
}
return 0;
}
int compareToFirstDiff(const string &bigger, const string &smaller) {
for (int i = 0; i < smaller.size(); i++) {
int result = bigger[i] - smaller[i];
if (result != 0) {
return result;
}
}
return 0;
}
void increment(string &source, uint from) {
const uint lastIdx = source.size() - 1;
if (source[lastIdx] != '9') {
source[lastIdx] = source[lastIdx] + 1;
return;
}
int idx = lastIdx;
while (idx > from && source[idx] == '9') {
idx -= 1;
}
if (idx == from && source[idx] == '9') {
source.replace(idx, source.size() - idx, source.size() - idx, '0');
source += '0';
return;
}
source[idx] = source[idx] + 1;
idx += 1;
source.replace(idx, source.size() - idx, source.size() - idx, '0');
}
uint step(string ¤t, const string &next) {
int comparison = compare(current, next);
if (comparison < 0) {
current.assign(next);
return 0;
}
if (comparison == 0) {
current += '0';
return 1;
}
int prefixesComparison = compareToFirstDiff(current, next);
if (prefixesComparison == 0) {
increment(current, next.size());
} else {
current.replace(0, next.size(), next);
current.replace(next.size(), current.size() - next.size(), current.size() - next.size(), '0');
if (prefixesComparison > 0) {
current += '0';
}
}
return current.size() - next.size();
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int size;
cin >> size;
string current;
current.reserve(200001);
cin >> current;
unsigned long long counter = 0;
string next;
for (int i = 1; i < size; i++) {
cin >> next;
counter += step(current, next);
}
cout << counter << 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 | #include <iostream> using namespace std; int compare(const string &a, const string &b) { if (a.size() > b.size()) { return 1; } if (a.size() < b.size()) { return -1; } for (int i = 0; i < a.size(); i++) { if (a[i] != b[i]) { return a[i] - b[i]; } } return 0; } int compareToFirstDiff(const string &bigger, const string &smaller) { for (int i = 0; i < smaller.size(); i++) { int result = bigger[i] - smaller[i]; if (result != 0) { return result; } } return 0; } void increment(string &source, uint from) { const uint lastIdx = source.size() - 1; if (source[lastIdx] != '9') { source[lastIdx] = source[lastIdx] + 1; return; } int idx = lastIdx; while (idx > from && source[idx] == '9') { idx -= 1; } if (idx == from && source[idx] == '9') { source.replace(idx, source.size() - idx, source.size() - idx, '0'); source += '0'; return; } source[idx] = source[idx] + 1; idx += 1; source.replace(idx, source.size() - idx, source.size() - idx, '0'); } uint step(string ¤t, const string &next) { int comparison = compare(current, next); if (comparison < 0) { current.assign(next); return 0; } if (comparison == 0) { current += '0'; return 1; } int prefixesComparison = compareToFirstDiff(current, next); if (prefixesComparison == 0) { increment(current, next.size()); } else { current.replace(0, next.size(), next); current.replace(next.size(), current.size() - next.size(), current.size() - next.size(), '0'); if (prefixesComparison > 0) { current += '0'; } } return current.size() - next.size(); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int size; cin >> size; string current; current.reserve(200001); cin >> current; unsigned long long counter = 0; string next; for (int i = 1; i < size; i++) { cin >> next; counter += step(current, next); } cout << counter << endl; return 0; } |
English