#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; } |