#include <iostream> // std::cout #include <string> // std::string, std::stoll using namespace std; #define MAXL 13 #define LL long long LL to_int(const string& str) { return stoll(str); } LL decpow[] = { 1ll, 10ll, 100ll, 1000ll, 10000ll, 100000ll, 1000000ll, 10000000ll, 100000000ll, 1000000000ll, 10000000000ll, 100000000000ll, 1000000000000ll, 10000000000000ll, 100000000000000ll, 1000000000000000ll, 10000000000000000ll }; //////////////////////////////////////////////////////////////////////////////////////////////// int len(const string& str) { return str.size(); } bool isPrefix( std::string const& lhs, std::string const& rhs) { //shorter string first return std::equal(lhs.begin(), lhs.begin() + std::min( lhs.size(), rhs.size() ), rhs.begin() ); } int main() { int N; cin>>N; LL c = 0; LL prev = -1; string prevtxt = "0"; LL width = 1; string atxt; LL a; for (int i=0; i<N; ++i) { cin>>a; atxt = to_string(a); //cout<<"================================================"<<i<<endl; while (len(prevtxt)<width && len(prevtxt)<=MAXL) { prevtxt.append("0"); } prev = to_int(prevtxt); //cout<<"["<<i<<"]."<<prevtxt<<":"<<prev<<" / "<<atxt<<":"<<a<<endl; if (a>prev) { width = len(atxt); } else if (a==prev) { width += 1; c += width-len(atxt); } else { //a jest krótsze niż prev LL d = len(prevtxt) - len(atxt); if (isPrefix(atxt, prevtxt)) { LL increase = to_int( prevtxt.substr(len(atxt)) ) + 1; if (len(to_string(increase)) <= d) { c += width-len(atxt); a = a*decpow[d] + increase; atxt = to_string(a); } else { width += 1; c += width-len(atxt); } } else if (d==0) { width += 1; c += width-len(atxt); } else { //prev>a ale a nie jest prefixem if (to_int( prevtxt.substr(0,len(atxt)) ) < a) { c += width-len(atxt); } else { width += 1; c += width-len(atxt); } } } prevtxt = atxt; prev = a; } cout<< c <<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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include <iostream> // std::cout #include <string> // std::string, std::stoll using namespace std; #define MAXL 13 #define LL long long LL to_int(const string& str) { return stoll(str); } LL decpow[] = { 1ll, 10ll, 100ll, 1000ll, 10000ll, 100000ll, 1000000ll, 10000000ll, 100000000ll, 1000000000ll, 10000000000ll, 100000000000ll, 1000000000000ll, 10000000000000ll, 100000000000000ll, 1000000000000000ll, 10000000000000000ll }; //////////////////////////////////////////////////////////////////////////////////////////////// int len(const string& str) { return str.size(); } bool isPrefix( std::string const& lhs, std::string const& rhs) { //shorter string first return std::equal(lhs.begin(), lhs.begin() + std::min( lhs.size(), rhs.size() ), rhs.begin() ); } int main() { int N; cin>>N; LL c = 0; LL prev = -1; string prevtxt = "0"; LL width = 1; string atxt; LL a; for (int i=0; i<N; ++i) { cin>>a; atxt = to_string(a); //cout<<"================================================"<<i<<endl; while (len(prevtxt)<width && len(prevtxt)<=MAXL) { prevtxt.append("0"); } prev = to_int(prevtxt); //cout<<"["<<i<<"]."<<prevtxt<<":"<<prev<<" / "<<atxt<<":"<<a<<endl; if (a>prev) { width = len(atxt); } else if (a==prev) { width += 1; c += width-len(atxt); } else { //a jest krótsze niż prev LL d = len(prevtxt) - len(atxt); if (isPrefix(atxt, prevtxt)) { LL increase = to_int( prevtxt.substr(len(atxt)) ) + 1; if (len(to_string(increase)) <= d) { c += width-len(atxt); a = a*decpow[d] + increase; atxt = to_string(a); } else { width += 1; c += width-len(atxt); } } else if (d==0) { width += 1; c += width-len(atxt); } else { //prev>a ale a nie jest prefixem if (to_int( prevtxt.substr(0,len(atxt)) ) < a) { c += width-len(atxt); } else { width += 1; c += width-len(atxt); } } } prevtxt = atxt; prev = a; } cout<< c <<endl; return 0; } |