C23, memory mapping the input file.
Big boy in ~ .5 s.
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
typedef struct { HANDLE f_, m_; char* begin, * end; } MemFile;
MemFile Map(const char* s) {
MemFile f = {0, NULL, 0, 0};
do {
f.f_ = CreateFile(s, GENERIC_READ, FILE_SHARE_READ,
0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (f.f_ == INVALID_HANDLE_VALUE) break;
LARGE_INTEGER z;
if (!GetFileSizeEx(f.f_, &z)) break;
f.m_ = CreateFileMapping(f.f_, 0, PAGE_READONLY, 0, 0, 0);
if (f.m_ == NULL) break;
f.begin = (char*)MapViewOfFile(f.m_, FILE_MAP_READ, 0, 0, 0);
if (!f.begin) break;
f.end = f.begin + z.QuadPart;
} while (0);
return f;
}
void UnMap(MemFile* f) {
if (f->begin) UnmapViewOfFile(f->begin);
if (f->m_ != NULL) CloseHandle(f->m_);
if (f->f_ != INVALID_HANDLE_VALUE) CloseHandle(f->f_);
}
size_t f(char* line, int size, int digits) {
size_t n = 0;
for (int di = -1, d; d = 0, digits--; n = n * 10 + d - '0')
for (int i = di + 1; i < size - digits; ++i)
if (line[i] > d) d = line[i], di = i;
return n;
}
#include<stdio.h>
int main(int argc, char** args) {
if (argc < 2) return puts("Missing filename"), 1;
auto in = Map(args[1]);
size_t p1 = 0, p2 = 0, z = 0; auto cur = in.begin;
for (auto it = cur; it != in.end; ++it)
if (*it < '0') {
if (z) p1 += f(cur, z, 2), p2 += f(cur, z, 12), z = 0;
} else {
if (z == 0) cur = it;
++z;
}
printf("%llu\n%llu", p1, p2);
UnMap(&in);
}