#include <solution/1717.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    char *base;
    size_t size;
    size_t top;
} stack_t;

void init_stack(stack_t *s)
{
    s->base = malloc(sizeof(char) * 10);
    s->size = 10;
    s->top = 0;
}

void push(stack_t *s, char c)
{
    if (s->top + 1 >= s->size)
    {
        s->size += 10;
        s->base = realloc(s->base, sizeof(char) * s->size);
    }
    s->base[++(s->top)] = c;
}

char pop(stack_t *s)
{
    if (s->top == 0)
        return '\0';
    return s->base[(s->top)--];
}

void clear(stack_t *s)
{
    s->top = 0;
}

char top(stack_t *s)
{
    return s->base[s->top];
}

char *sts(stack_t *s)
{
    char *ret = malloc(sizeof(char) * (s->top + 1));

    memcpy(ret, s->base + 1, s->top);
    ret[s->top] = '\0';

    return ret;
}

void delete_stack(stack_t *s)
{
    free(s->base);
}

char *del(char *s, char m1, char m2, int *score, int v)
{
    stack_t st;
    init_stack(&st);
    while (*s)
    {
        if (top(&st) == m1 && *s == m2)
        {
            s += 1, *score += v;
            pop(&st);
        }
        else
            push(&st, *(s++));
    }

    char *r = sts(&st);
    delete_stack(&st);
    return r;
}

int maximumGain(char *s, int x, int y)
{
    int score = 0;
    if (x > y)
        del(del(s, 'a', 'b', &score, x), 'b', 'a', &score, y);
    else
        del(del(s, 'b', 'a', &score, y), 'a', 'b', &score, x);

    return score;
}
