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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/
#include <iostream>
#include <cstring>
#include <string> 
using namespace std;

struct Num {
    char letters[30] ;
    int length;
    
    void construct(const string& s) {
        memset(letters, '\0', 30);
        length = s.length();
        memcpy(letters, s.c_str(), 30);
    }
};

Num a;

void uzupelnij0(Num &num, int length) 
{
    if (num.length >= length) return;
    for (int i = num.length; i < 30 and i < length; ++i) 
    {
        num.letters[i] = '0';
    }
    num.length = length;
}

void dodaj1(Num &num, int beg) {
    if (num.length < 29) 
    {
        if (num.letters[num.length - 1] == '9') 
        // jak ostatnia 9
        {
            int i;
            num.letters[num.length - 1] = '0';
            for (i = num.length - 1; i >= beg && num.letters[i] == '9'; --i) 
            {
                num.letters[i] = '0';
            }
            if (i == beg) 
            // same 9
            {
                num.length++;        
                num.letters[num.length - 1] = 0;
            } 
            else 
            // nie same 9
            {
                num.letters[i]++;
            }
        }
        else 
        // ostatnia nie 9
        {
            num.letters[num.length - 1]++;
        }
    }
}

int compare(const string& s) {
    Num n;
    n.construct(s);
    
    if (!a.length) 
    { 
        a = n;
        return 0;
    }
    int i = 0;
    for (;n.letters[i] && a.letters[i] && n.letters[i] == a.letters[i]; ++i);
    
    if (!a.letters[i]) 
    // poprzednia sie skonczyla
    {
        if (!n.letters[i]) 
        // czyli byly rowne
        {
            n.letters[i] = '0';
            n.length++;
        } 
        // nowa wieksza to nic
    }
    else 
    // poprzednia sie nie skonczyla
    {
        if (!n.letters[i]) 
        // czyli nowa mniejsza i sie skoczyla
        {
            dodaj1(a, i);
            n = a;
        } 
        else
        // sa po prostu rozne
        {
            if (a.letters[i] > n.letters[i]) 
            // actual ma wieksza cyfre
            {
                if (a.length >= n.length)
                {
                    uzupelnij0(n, a.length + 1);
                }
            } 
            else 
            // actual ma mniejsza cyfre
            {
                if (a.length >= n.length)
                {
                    uzupelnij0(n, a.length);
                }
            }
        }
    }
    
    a = n;
    return (a.length- s.length());
}

int main()
{
    int count;
    cin >> count; 
    string prev = "";

    long long result = 0;
    while (count--) 
    {
        string next;
        cin >> next;
        result += compare(next);
    }
    cout << result;
    return 0;
}