This commit is contained in:
2025-07-24 18:31:35 +08:00
parent 5f7ef7b880
commit f6e998beff
3 changed files with 132 additions and 0 deletions

91
src/1717.c Normal file
View File

@@ -0,0 +1,91 @@
#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;
}