#include <tuple>
#include <vector>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int,int>;
using vi = vector<int>;
using vb = vector<bool>;
using vc = vector<char>;
using vvi = vector<vi>;
using vpii = vector<pii>;
using vll = vector<ll>;
using vull = vector<ull>;
#define ever (;;)
#define f first
#define s second
#define pb emplace_back
#define sz size()
#define graph vector<vertex>
#define deg(X) G[X].e.size()
#define INF 1234567890
#define INFll 2000000000000000000
#define maxe(X, Y) if((Y) > (X)) (X) = (Y)
#define mine(X, Y) if((Y) < (X)) (X) = (Y)
#define rep(i, begin, end) for(__typeof(end) i = (begin); i < (end); ++i)
#define repr(i, begin, end) for(__typeof(end) i = (begin)-1; i >= (end); --i)
#define bend(X) X.begin(), X.end()
int n;
vector<string> T;
vi CO;
vpii DP;
void in() {
cin >> n;
T.resize(n);
DP.resize(n);
CO.resize(n);
rep(i, 0, n)
cin >> T[i];
}
int getDiff(string a, string b) {
rep(i, 0, (int)min(a.sz, b.sz))
if(a[i] != b[i])
return i;
return -1;
}
int getSz(int x) {
int R = 1;
rep(i, 0, (int)min(6, x))
R *= 10;
return R-1;
}
int main() {
in();
CO[0] = 0;
DP[0] = {0, 0};
rep(i, 1, n) {
//cout << T[i] << " : " << T[i-1] << " ";
if(T[i].sz > T[i-1].sz+CO[i-1])
continue;
int k = getDiff(T[i-1], T[i]);
if(k < 0) {
//cout << "sa takie same\n";
CO[i] = T[i-1].sz+CO[i-1]-T[i].sz;
if(T[i].sz > T[i-1].sz)
DP[i] = {CO[i], getSz(CO[i])};
else if(T[i].sz <= T[i-1].sz)
DP[i] = {DP[i-1].f, DP[i-1].s-1};
}
else if(T[i][k] < T[i-1][k]) {
//printf("jest mniejszy\n");
CO[i] = T[i-1].sz - T[i].sz + CO[i-1] + 1;
DP[i] = {CO[i], getSz(CO[i])};
}
else if(T[i][k] > T[i-1][k]) {
//printf("jest wiekszy\n");
CO[i] = T[i-1].sz - T[i].sz + CO[i-1];
DP[i] = {CO[i], getSz(CO[i])};
}
else
printf("popsute\n");
if(DP[i].s < 0)
++CO[i],
DP[i] = {CO[i], getSz(CO[i])};
//printf("CO[%d] = %d\n", i, CO[i]);
//printf("DP[%d] = {%d, %d}\n", i, DP[i].f, DP[i].s);
}
ll R = 0;
rep(i, 0, n)
R += CO[i];
printf("%lld\n", R);
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 | #include <tuple> #include <vector> #include <stdio.h> #include <iostream> #include <algorithm> #include <functional> using namespace std; using ll = long long; using ull = unsigned long long; using pii = pair<int,int>; using vi = vector<int>; using vb = vector<bool>; using vc = vector<char>; using vvi = vector<vi>; using vpii = vector<pii>; using vll = vector<ll>; using vull = vector<ull>; #define ever (;;) #define f first #define s second #define pb emplace_back #define sz size() #define graph vector<vertex> #define deg(X) G[X].e.size() #define INF 1234567890 #define INFll 2000000000000000000 #define maxe(X, Y) if((Y) > (X)) (X) = (Y) #define mine(X, Y) if((Y) < (X)) (X) = (Y) #define rep(i, begin, end) for(__typeof(end) i = (begin); i < (end); ++i) #define repr(i, begin, end) for(__typeof(end) i = (begin)-1; i >= (end); --i) #define bend(X) X.begin(), X.end() int n; vector<string> T; vi CO; vpii DP; void in() { cin >> n; T.resize(n); DP.resize(n); CO.resize(n); rep(i, 0, n) cin >> T[i]; } int getDiff(string a, string b) { rep(i, 0, (int)min(a.sz, b.sz)) if(a[i] != b[i]) return i; return -1; } int getSz(int x) { int R = 1; rep(i, 0, (int)min(6, x)) R *= 10; return R-1; } int main() { in(); CO[0] = 0; DP[0] = {0, 0}; rep(i, 1, n) { //cout << T[i] << " : " << T[i-1] << " "; if(T[i].sz > T[i-1].sz+CO[i-1]) continue; int k = getDiff(T[i-1], T[i]); if(k < 0) { //cout << "sa takie same\n"; CO[i] = T[i-1].sz+CO[i-1]-T[i].sz; if(T[i].sz > T[i-1].sz) DP[i] = {CO[i], getSz(CO[i])}; else if(T[i].sz <= T[i-1].sz) DP[i] = {DP[i-1].f, DP[i-1].s-1}; } else if(T[i][k] < T[i-1][k]) { //printf("jest mniejszy\n"); CO[i] = T[i-1].sz - T[i].sz + CO[i-1] + 1; DP[i] = {CO[i], getSz(CO[i])}; } else if(T[i][k] > T[i-1][k]) { //printf("jest wiekszy\n"); CO[i] = T[i-1].sz - T[i].sz + CO[i-1]; DP[i] = {CO[i], getSz(CO[i])}; } else printf("popsute\n"); if(DP[i].s < 0) ++CO[i], DP[i] = {CO[i], getSz(CO[i])}; //printf("CO[%d] = %d\n", i, CO[i]); //printf("DP[%d] = {%d, %d}\n", i, DP[i].f, DP[i].s); } ll R = 0; rep(i, 0, n) R += CO[i]; printf("%lld\n", R); return 0; } |
English