#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
/// Goal:
/// Given a long string of digits and a window size k (e.g., 13),
/// find the maximum product of any k consecutive digits.
/// Idea:
/// Any window containing a 0 has product 0. So the string naturally splits into zero-free segments.
/// In a zero-free segments, use the sliding window and update the product:
/// when you slide right by 1
/// remove the left digit `a` and add the right digit `b`
/// new product = old_product / a * b
/// (if division worries you, try re-compute.)
/// In a segment shorter than k, just ignore it.
#ifndef K
#define K (13)
#endif // K
#ifndef ASCII2DIGIT
#define ASCII2DIGIT(c) ((c) - '0')
#endif // ASCII2DIGIT
char digits[] = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
uint64_t solve()
{
uint64_t count = 0;
char ** segments = NULL;
char * seg_begin = digits;
char * seg_end = digits;
while (*seg_end != '\0')
{
if (*seg_end == '0')
{
uint64_t len = ((uint64_t) seg_end - (uint64_t) seg_begin);
if (len != 0)
{
segments = realloc(segments, ++count * sizeof(char*));
if (!segments)
{
fprintf(stderr, "Memory allocation failure.\n");
exit(EXIT_FAILURE);
}
segments[count-1] = strndup(seg_begin, len);
}
seg_end++;
seg_begin = seg_end;
}
else
{
seg_end++;
}
}
uint64_t product = 0;
for (uint64_t i = 0; i < count; i++)
{
char * segment = segments[i];
uint64_t len = strlen(segment);
if (len >= K)
{
uint64_t window_size = len - K;
for (uint64_t w = 0; w <= window_size; w++)
{
uint64_t temp = 1;
for (uint64_t k = 0; k < K; k++)
{
temp *= ASCII2DIGIT(segment[w + k]);
}
if (temp > product)
{
product = temp;
}
}
}
free(segment);
}
free(segments);
return product;
}
int main()
{
fprintf(stdout, "%lu\n", solve());
return 0;
}