#include <iostream>
#include <string>
#include <cstdint>
#include <algorithm>
const int MAX_NUMBER_COUNT = 200000;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int N;
std::cin >> N;
int newNumber;
std::cin >> newNumber;
std::string lastNumberStr = std::to_string(newNumber);
int lastNumberBaseEnd = lastNumberStr.size();
int lastNumberZeroesEnd = lastNumberStr.size();
lastNumberStr.reserve(MAX_NUMBER_COUNT);
long long int newDigitsCount = 0;
for (int i = 1; i < N; ++i) {
std::cin >> newNumber;
std::string newNumberStr = std::to_string(newNumber);
if (newNumberStr.size() < lastNumberStr.size()
|| (newNumberStr.size() == lastNumberStr.size()
&& newNumberStr <= lastNumberStr.substr(0, newNumberStr.size()))) {
bool newBeginningLower = newNumberStr < lastNumberStr.substr(0, newNumberStr.size());
int currentNewDigits = 0;
if (newBeginningLower) {
currentNewDigits = lastNumberStr.size() - newNumberStr.size() + 1;
lastNumberBaseEnd = newNumberStr.size();
} else if (newNumberStr == lastNumberStr.substr(0, newNumberStr.size())) {
bool couldIncrease = false;
int numberEnd = 0;
for (auto it = lastNumberStr.rbegin(); !couldIncrease && it != lastNumberStr.rend()-newNumberStr.size(); ++it) {
if (lastNumberZeroesEnd > lastNumberBaseEnd && it == lastNumberStr.rend() - lastNumberZeroesEnd) {
couldIncrease = true;
numberEnd = lastNumberStr.rend() - it;
(*it) = '1';
} else if ((*it) != '9') {
couldIncrease = true;
numberEnd = lastNumberStr.rend() - it;
(*it)++;
} else (*it) = '0';
}
if (couldIncrease) {
currentNewDigits = lastNumberStr.size() - newNumberStr.size();
lastNumberBaseEnd = numberEnd;
} else {
currentNewDigits = lastNumberStr.size() - newNumberStr.size() + 1;
lastNumberBaseEnd = newNumberStr.size();
}
} else {
currentNewDigits = lastNumberStr.size() - newNumberStr.size();
lastNumberBaseEnd = newNumberStr.size();
}
std::copy(newNumberStr.begin(), newNumberStr.end(), lastNumberStr.begin());
newDigitsCount += currentNewDigits;
lastNumberZeroesEnd = newNumberStr.size() + currentNewDigits;
lastNumberStr.resize(newNumberStr.size() + currentNewDigits);
if (lastNumberBaseEnd < 10 && lastNumberZeroesEnd > lastNumberBaseEnd)
std::fill(lastNumberStr.begin() + lastNumberBaseEnd, lastNumberStr.begin() + lastNumberZeroesEnd, '0');
} else {
lastNumberStr.resize(newNumberStr.size());
std::copy(newNumberStr.begin(), newNumberStr.end(), lastNumberStr.begin());
}
}
std::cout << newDigitsCount << "\n";
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 | #include <iostream> #include <string> #include <cstdint> #include <algorithm> const int MAX_NUMBER_COUNT = 200000; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int N; std::cin >> N; int newNumber; std::cin >> newNumber; std::string lastNumberStr = std::to_string(newNumber); int lastNumberBaseEnd = lastNumberStr.size(); int lastNumberZeroesEnd = lastNumberStr.size(); lastNumberStr.reserve(MAX_NUMBER_COUNT); long long int newDigitsCount = 0; for (int i = 1; i < N; ++i) { std::cin >> newNumber; std::string newNumberStr = std::to_string(newNumber); if (newNumberStr.size() < lastNumberStr.size() || (newNumberStr.size() == lastNumberStr.size() && newNumberStr <= lastNumberStr.substr(0, newNumberStr.size()))) { bool newBeginningLower = newNumberStr < lastNumberStr.substr(0, newNumberStr.size()); int currentNewDigits = 0; if (newBeginningLower) { currentNewDigits = lastNumberStr.size() - newNumberStr.size() + 1; lastNumberBaseEnd = newNumberStr.size(); } else if (newNumberStr == lastNumberStr.substr(0, newNumberStr.size())) { bool couldIncrease = false; int numberEnd = 0; for (auto it = lastNumberStr.rbegin(); !couldIncrease && it != lastNumberStr.rend()-newNumberStr.size(); ++it) { if (lastNumberZeroesEnd > lastNumberBaseEnd && it == lastNumberStr.rend() - lastNumberZeroesEnd) { couldIncrease = true; numberEnd = lastNumberStr.rend() - it; (*it) = '1'; } else if ((*it) != '9') { couldIncrease = true; numberEnd = lastNumberStr.rend() - it; (*it)++; } else (*it) = '0'; } if (couldIncrease) { currentNewDigits = lastNumberStr.size() - newNumberStr.size(); lastNumberBaseEnd = numberEnd; } else { currentNewDigits = lastNumberStr.size() - newNumberStr.size() + 1; lastNumberBaseEnd = newNumberStr.size(); } } else { currentNewDigits = lastNumberStr.size() - newNumberStr.size(); lastNumberBaseEnd = newNumberStr.size(); } std::copy(newNumberStr.begin(), newNumberStr.end(), lastNumberStr.begin()); newDigitsCount += currentNewDigits; lastNumberZeroesEnd = newNumberStr.size() + currentNewDigits; lastNumberStr.resize(newNumberStr.size() + currentNewDigits); if (lastNumberBaseEnd < 10 && lastNumberZeroesEnd > lastNumberBaseEnd) std::fill(lastNumberStr.begin() + lastNumberBaseEnd, lastNumberStr.begin() + lastNumberZeroesEnd, '0'); } else { lastNumberStr.resize(newNumberStr.size()); std::copy(newNumberStr.begin(), newNumberStr.end(), lastNumberStr.begin()); } } std::cout << newDigitsCount << "\n"; return 0; } |
English