91 lines
1.4 KiB
C
91 lines
1.4 KiB
C
#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;
|
|
} |