#include #include #include #include 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; }