#include <iostream> #include <vector> #include <cmath> #include <string> #include <cassert> using namespace std; const long long EQUAL = 0; const long long LEFT_GRT = 1; const long long RIGHT_GRT = 2; long long compare(string& l, string& r, long long num) { if (num == -1) { num = max(l.length(), r.length()); if (l.length() != r.length()) { return l.length() < r.length(); } } for (long long i = 0; i < num; ++i) { if (l[i] < r[i]) { return RIGHT_GRT; } else if (l[i] > r[i]) { return LEFT_GRT; } } return EQUAL; } long long leftGrtCase(string& lastContract, string& contract) { long long suflen = lastContract.length() - contract.length() + 1; string sufix(suflen, '0'); contract += sufix; lastContract = contract; return suflen; } long long rightGrtCase(string& lastContract, string& contract) { long long suflen = lastContract.length() - contract.length(); string sufix(suflen, '0'); contract += sufix; lastContract = contract; return suflen; } long long equalCase(string& lastContract, string& contract) { long long suflen = lastContract.length() - contract.length(); string sufix = lastContract.substr(contract.length()); // edge case string hellString(suflen, '9'); if (compare(hellString, sufix, -1) == EQUAL) { return leftGrtCase(lastContract, contract); } contract += sufix; for (long long i = contract.length() - 1; i >= 0; --i) { if (contract[i] == '9') { contract[i] = '0'; } else { contract[i] += 1; break; } } lastContract = contract; return suflen; } long long modify(string& lastContract, string& contract) { if (compare(lastContract, contract, -1) == RIGHT_GRT) { lastContract = contract; return 0; } switch (compare(lastContract, contract, contract.length())) { // prefix mam mniejszy, wiec dopelniam zerami i dodaję dodatkowe zero case LEFT_GRT: return leftGrtCase(lastContract, contract); // prefix mam wiekszy, wiec dopelniam zerami case RIGHT_GRT: return rightGrtCase(lastContract, contract); case EQUAL: return equalCase(lastContract, contract); } } int main() { long long contractsNo; cin >> contractsNo; string lastContract; cin >> lastContract; long long extraDigits = 0; for (long long i = 1; i < contractsNo; ++i) { string contract; cin >> contract; long long cost = modify(lastContract, contract); extraDigits += cost; } cout << extraDigits << 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> #include <vector> #include <cmath> #include <string> #include <cassert> using namespace std; const long long EQUAL = 0; const long long LEFT_GRT = 1; const long long RIGHT_GRT = 2; long long compare(string& l, string& r, long long num) { if (num == -1) { num = max(l.length(), r.length()); if (l.length() != r.length()) { return l.length() < r.length(); } } for (long long i = 0; i < num; ++i) { if (l[i] < r[i]) { return RIGHT_GRT; } else if (l[i] > r[i]) { return LEFT_GRT; } } return EQUAL; } long long leftGrtCase(string& lastContract, string& contract) { long long suflen = lastContract.length() - contract.length() + 1; string sufix(suflen, '0'); contract += sufix; lastContract = contract; return suflen; } long long rightGrtCase(string& lastContract, string& contract) { long long suflen = lastContract.length() - contract.length(); string sufix(suflen, '0'); contract += sufix; lastContract = contract; return suflen; } long long equalCase(string& lastContract, string& contract) { long long suflen = lastContract.length() - contract.length(); string sufix = lastContract.substr(contract.length()); // edge case string hellString(suflen, '9'); if (compare(hellString, sufix, -1) == EQUAL) { return leftGrtCase(lastContract, contract); } contract += sufix; for (long long i = contract.length() - 1; i >= 0; --i) { if (contract[i] == '9') { contract[i] = '0'; } else { contract[i] += 1; break; } } lastContract = contract; return suflen; } long long modify(string& lastContract, string& contract) { if (compare(lastContract, contract, -1) == RIGHT_GRT) { lastContract = contract; return 0; } switch (compare(lastContract, contract, contract.length())) { // prefix mam mniejszy, wiec dopelniam zerami i dodaję dodatkowe zero case LEFT_GRT: return leftGrtCase(lastContract, contract); // prefix mam wiekszy, wiec dopelniam zerami case RIGHT_GRT: return rightGrtCase(lastContract, contract); case EQUAL: return equalCase(lastContract, contract); } } int main() { long long contractsNo; cin >> contractsNo; string lastContract; cin >> lastContract; long long extraDigits = 0; for (long long i = 1; i < contractsNo; ++i) { string contract; cin >> contract; long long cost = modify(lastContract, contract); extraDigits += cost; } cout << extraDigits << endl; return 0; } |