#include <iostream>
using namespace std;
void printString(string& s) {
for (size_t i = 0; i < s.size(); ++i)
{
cout << s[i];
}
cout << endl;
}
string zeros[20];
void fill_zeros() {
zeros[0] = "";
for (int i = 1; i < 20; ++i)
{
zeros[i] = zeros[i - 1] + "0";
}
}
string seq[200005];
unsigned int s[200005];
int main()
{
//ios_base::sync_with_stdio(false);
int N;
cin >> N;
long long result = 0;
for (int i = 0; i < N; i++) {
scanf("%u", &(s[i]));
seq[i] += to_string(s[i]);
}
string prev = seq[0];
string cur;
fill_zeros();
int len_prev = 17;
for (int i = 1; i < N; i++) { // aktualny z poprzednim porównać trzeba;
//if (prev.size() > 19) break;
if (prev.size() < 17) {
cur = seq[i];
if (cur.size() == prev.size()) {
if (cur == prev) {
prev += "0"; // next zwraca liczbę o jeden wieksza w postaci stringa
++result; // tyle dopisałem
}
else if (cur > prev) {
prev = cur;
// result sie nie zmienia nic nie dopisałem
}
else { // cur < prev
prev = cur + "0";
++result;
}
}
else if (cur.size() > prev.size()){
prev = cur;
}
else { // cur size < prev size
string prev_prefix = prev.substr(0, cur.size());
//jesli cur jest prefixem prev
if (prev_prefix == cur) {
long long aux = stoll(prev);
++aux;
string aux_prev = to_string(aux);
if (cur == aux_prev.substr(0, cur.size())) {
prev = aux_prev;
result += prev.size() - cur.size();
}
else { // to oznacza ze w previe byly same dziewiatki na koncu i sie cos zepsulo
prev = cur + zeros[prev.size() - cur.size() + 1];
result += prev.size() - cur.size();
}
}
else if (prev_prefix < cur) {
result += prev.size() - cur.size();//ilosctychzer do dopisania;
prev = cur + zeros[prev.size() - cur.size()]; // tych zer ma być tyle żeby size nowegopreva był jak size poprzedniego
}
else { // prev prefix > cur
result += prev.size() - cur.size() + 1;
prev = cur + zeros[prev.size() - cur.size() + 1] ; // tych zer o jeden wiecej niz wyzej
}
}
}
else { // co jesli prev przekroczyl bariere ? długosci len_prev mamy rowne 17
cur = seq[i];
string prev_prefix = prev.substr(0, cur.size());
if (prev_prefix == cur) {
result += len_prev - cur.size(); // i len_prev sie nie zmienia
}
else if (prev_prefix > cur) {
++len_prev;
result += len_prev - cur.size();
prev = cur + zeros[17 - cur.size()];
}
else { //prev__prefix < cur
result += len_prev - cur.size();
prev = cur + zeros[17 - cur.size()];
}
}
}
cout << result << "\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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <iostream> using namespace std; void printString(string& s) { for (size_t i = 0; i < s.size(); ++i) { cout << s[i]; } cout << endl; } string zeros[20]; void fill_zeros() { zeros[0] = ""; for (int i = 1; i < 20; ++i) { zeros[i] = zeros[i - 1] + "0"; } } string seq[200005]; unsigned int s[200005]; int main() { //ios_base::sync_with_stdio(false); int N; cin >> N; long long result = 0; for (int i = 0; i < N; i++) { scanf("%u", &(s[i])); seq[i] += to_string(s[i]); } string prev = seq[0]; string cur; fill_zeros(); int len_prev = 17; for (int i = 1; i < N; i++) { // aktualny z poprzednim porównać trzeba; //if (prev.size() > 19) break; if (prev.size() < 17) { cur = seq[i]; if (cur.size() == prev.size()) { if (cur == prev) { prev += "0"; // next zwraca liczbę o jeden wieksza w postaci stringa ++result; // tyle dopisałem } else if (cur > prev) { prev = cur; // result sie nie zmienia nic nie dopisałem } else { // cur < prev prev = cur + "0"; ++result; } } else if (cur.size() > prev.size()){ prev = cur; } else { // cur size < prev size string prev_prefix = prev.substr(0, cur.size()); //jesli cur jest prefixem prev if (prev_prefix == cur) { long long aux = stoll(prev); ++aux; string aux_prev = to_string(aux); if (cur == aux_prev.substr(0, cur.size())) { prev = aux_prev; result += prev.size() - cur.size(); } else { // to oznacza ze w previe byly same dziewiatki na koncu i sie cos zepsulo prev = cur + zeros[prev.size() - cur.size() + 1]; result += prev.size() - cur.size(); } } else if (prev_prefix < cur) { result += prev.size() - cur.size();//ilosctychzer do dopisania; prev = cur + zeros[prev.size() - cur.size()]; // tych zer ma być tyle żeby size nowegopreva był jak size poprzedniego } else { // prev prefix > cur result += prev.size() - cur.size() + 1; prev = cur + zeros[prev.size() - cur.size() + 1] ; // tych zer o jeden wiecej niz wyzej } } } else { // co jesli prev przekroczyl bariere ? długosci len_prev mamy rowne 17 cur = seq[i]; string prev_prefix = prev.substr(0, cur.size()); if (prev_prefix == cur) { result += len_prev - cur.size(); // i len_prev sie nie zmienia } else if (prev_prefix > cur) { ++len_prev; result += len_prev - cur.size(); prev = cur + zeros[17 - cur.size()]; } else { //prev__prefix < cur result += len_prev - cur.size(); prev = cur + zeros[17 - cur.size()]; } } } cout << result << "\n"; return 0; } |
English