#define _USE_MATH_DEFINES/////////////////////////////////////////////////////
#include <bits/stdc++.h>//////////////////////////////////////////////////////
#ifdef LOC////////////////////////////////////////////////////////////////////
#include "debuglib.h"/////////////////////////////////////////////////////////
#else/////////////////////////////////////////////////////////////////////////
#define deb(...)//////////////////////////////////////////////////////////////
#define DBP(...)//////////////////////////////////////////////////////////////
#endif////////////////////////////////////////////////////////////////////////
#define x first///////////////////////////////////////////////////////////////
#define y second//////////////////////////////////////////////////////////////
#define mp make_pair//////////////////////////////////////////////////////////
#define pb push_back//////////////////////////////////////////////////////////
#define sz(x)int((x).size())//////////////////////////////////////////////////
#define each(a,x)for(auto&a:(x))//////////////////////////////////////////////
#define all(x)(x).begin(),(x).end()///////////////////////////////////////////
#define rep(i,b,e)for(int i=(b);i<(e);i++)////////////////////////////////////
using namespace std;using namespace rel_ops;using ll=int64_t;using Pii=pair///
<int,int>;using ull=uint64_t;using Vi=vector<int>;void run();int main(){cin.//
sync_with_stdio(0);cin.tie(0);cout<<fixed<<setprecision(20);run();return 0;}//
//--------------------------------------------------------------------------//
Vi number, version;
int currentVer = 1;
ll ans = 0;
Vi loadNumber() {
int tmp; cin >> tmp;
Vi out;
while (tmp > 0) {
out.pb(tmp % 10);
tmp /= 10;
}
return out;
}
void setDigit(int i, int d) {
number[i] = d;
version[i] = currentVer;
}
int getDigit(int i) {
if (version[i] != currentVer) setDigit(i, 0);
return number[i];
}
void setNumber(const Vi& tail, int len) {
currentVer++;
number.resize(len);
version.resize(len);
rep(i, 0, sz(tail)) setDigit(len-sz(tail)+i, tail[i]);
}
int cmpTail(const Vi& tail) {
rep(i, 0, sz(tail)) {
int a = getDigit(sz(number)-i-1);
int b = tail[sz(tail)-i-1];
if (a != b) return a < b ? -1 : 1;
}
return 0;
}
bool increment() {
rep(i, 0, sz(number)) {
int d = getDigit(i) + 1;
setDigit(i, d%10);
if (d < 10) return true;
}
return false;
}
void handle() {
Vi cur = loadNumber();
if (sz(cur) > sz(number)) {
setNumber(cur, sz(cur));
return;
}
int cmp = cmpTail(cur);
if (cmp < 0) {
setNumber(cur, sz(number));
} else if (cmp > 0) {
setNumber(cur, sz(number)+1);
} else if (!increment() || cmpTail(cur) != 0) {
setNumber(cur, sz(number)+1);
}
ans += sz(number) - sz(cur);
}
void run() {
int n; cin >> n;
number = loadNumber();
version.resize(sz(number), currentVer);
rep(i, 0, n-1) handle();
cout << ans << endl;
}
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 | #define _USE_MATH_DEFINES///////////////////////////////////////////////////// #include <bits/stdc++.h>////////////////////////////////////////////////////// #ifdef LOC//////////////////////////////////////////////////////////////////// #include "debuglib.h"///////////////////////////////////////////////////////// #else///////////////////////////////////////////////////////////////////////// #define deb(...)////////////////////////////////////////////////////////////// #define DBP(...)////////////////////////////////////////////////////////////// #endif//////////////////////////////////////////////////////////////////////// #define x first/////////////////////////////////////////////////////////////// #define y second////////////////////////////////////////////////////////////// #define mp make_pair////////////////////////////////////////////////////////// #define pb push_back////////////////////////////////////////////////////////// #define sz(x)int((x).size())////////////////////////////////////////////////// #define each(a,x)for(auto&a:(x))////////////////////////////////////////////// #define all(x)(x).begin(),(x).end()/////////////////////////////////////////// #define rep(i,b,e)for(int i=(b);i<(e);i++)//////////////////////////////////// using namespace std;using namespace rel_ops;using ll=int64_t;using Pii=pair/// <int,int>;using ull=uint64_t;using Vi=vector<int>;void run();int main(){cin.// sync_with_stdio(0);cin.tie(0);cout<<fixed<<setprecision(20);run();return 0;}// //--------------------------------------------------------------------------// Vi number, version; int currentVer = 1; ll ans = 0; Vi loadNumber() { int tmp; cin >> tmp; Vi out; while (tmp > 0) { out.pb(tmp % 10); tmp /= 10; } return out; } void setDigit(int i, int d) { number[i] = d; version[i] = currentVer; } int getDigit(int i) { if (version[i] != currentVer) setDigit(i, 0); return number[i]; } void setNumber(const Vi& tail, int len) { currentVer++; number.resize(len); version.resize(len); rep(i, 0, sz(tail)) setDigit(len-sz(tail)+i, tail[i]); } int cmpTail(const Vi& tail) { rep(i, 0, sz(tail)) { int a = getDigit(sz(number)-i-1); int b = tail[sz(tail)-i-1]; if (a != b) return a < b ? -1 : 1; } return 0; } bool increment() { rep(i, 0, sz(number)) { int d = getDigit(i) + 1; setDigit(i, d%10); if (d < 10) return true; } return false; } void handle() { Vi cur = loadNumber(); if (sz(cur) > sz(number)) { setNumber(cur, sz(cur)); return; } int cmp = cmpTail(cur); if (cmp < 0) { setNumber(cur, sz(number)); } else if (cmp > 0) { setNumber(cur, sz(number)+1); } else if (!increment() || cmpTail(cur) != 0) { setNumber(cur, sz(number)+1); } ans += sz(number) - sz(cur); } void run() { int n; cin >> n; number = loadNumber(); version.resize(sz(number), currentVer); rep(i, 0, n-1) handle(); cout << ans << endl; } |
English