#include <cstdio> #include <cstring> using namespace std; int getCase(char *curr, int currLen, char *next, int nextLen) { if (nextLen > currLen) { return 1; // next number longer (and greater) than curr number } char *cr = curr; char *nx = next; while (*nx) { if (*nx < *cr) { return 2; // next number shorter and smaller lexicografically than curr number } if (*nx > *cr) { return 3; // next number shorter and greater lexicografically than curr number } cr++; nx++; } return 4; // next number is a prefix of curr number } char curr[300000]; int main() { int n; scanf("%d", &n); long long result = 0; scanf("\n%s", curr); int currLen = strlen(curr); for (int i = 1; i < n; i++) { char next[20]; scanf("\n%s", next); int nextLen = strlen(next); int caseNo = getCase(curr, currLen, next, nextLen); switch (caseNo) { case 1: currLen = nextLen; memcpy(curr, next, currLen); break; case 2: currLen++; case 3: result += currLen - nextLen; memcpy(curr, next, nextLen); memset(curr + nextLen, '0', currLen - nextLen); break; case 4: result += currLen - nextLen; int j = currLen - 1; while (j >= nextLen && curr[j] == '9') { curr[j] = '0'; j--; } if (j >= nextLen) { curr[j]++; } else { result++; currLen++; curr[currLen - 1] = '0'; } break; } } printf("%lld\n", result); 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 | #include <cstdio> #include <cstring> using namespace std; int getCase(char *curr, int currLen, char *next, int nextLen) { if (nextLen > currLen) { return 1; // next number longer (and greater) than curr number } char *cr = curr; char *nx = next; while (*nx) { if (*nx < *cr) { return 2; // next number shorter and smaller lexicografically than curr number } if (*nx > *cr) { return 3; // next number shorter and greater lexicografically than curr number } cr++; nx++; } return 4; // next number is a prefix of curr number } char curr[300000]; int main() { int n; scanf("%d", &n); long long result = 0; scanf("\n%s", curr); int currLen = strlen(curr); for (int i = 1; i < n; i++) { char next[20]; scanf("\n%s", next); int nextLen = strlen(next); int caseNo = getCase(curr, currLen, next, nextLen); switch (caseNo) { case 1: currLen = nextLen; memcpy(curr, next, currLen); break; case 2: currLen++; case 3: result += currLen - nextLen; memcpy(curr, next, nextLen); memset(curr + nextLen, '0', currLen - nextLen); break; case 4: result += currLen - nextLen; int j = currLen - 1; while (j >= nextLen && curr[j] == '9') { curr[j] = '0'; j--; } if (j >= nextLen) { curr[j]++; } else { result++; currLen++; curr[currLen - 1] = '0'; } break; } } printf("%lld\n", result); return 0; } |