T4



#include<bits/stdc++.h>
using namespace std;
const int N = 1000 + 10;
char s[N];
int f[N][N];
int main()
{
    cin >> s;
    int n = strlen(s);
    for(int len = 1;len < n;len++)
    {
        for(int i = 0;i + len - 1 < n;i++)
        {
            int l = i,r = i + len - 1;
            if(s[l] == s[r]) f[l][r] = f[l + 1][r - 1];
            else f[l][r] = min(f[l + 1][r],f[l][r - 1]) + 1;
        }
    }
    string tmp;
    int l = 0,r = n-1;
    while(l <= r)
    {
        if(s[l] == s[r])
        {
            tmp.push_back(s[l]);
            l++,r--;
        }
        else if(f[l + 1][r] < f[l][r - 1])
        {
            tmp.push_back(s[l]);
            l++;
        }
        else if(f[l + 1][r] > f[l][r - 1])
        {
            tmp.push_back(s[r]);
            r--;
        }
        else if(s[l] < s[r])
        {
            tmp.push_back(s[l]);
            l++;
        }
        else
        {
            tmp.push_back(s[r]);
            r--;
        }
    }
    string tmpp = tmp;
    reverse(tmpp.begin(),tmpp.end());
    if(l - r > 1)
        tmpp = tmpp.substr(1,tmpp.size() - 1);
    cout << tmp + tmpp;
    return 0;
}

T3

#include <bits/stdc++.h>
using namespace std;
int A, B, C;
int res, steps;
struct State 
{
    int a, b, c;
    int steps;
    bool operator<(const State& other) const 
	{
        if (a != other.a) 
			return a < other.a;
        if (b != other.b) 
			return b < other.b;
        return c < other.c;
    }
};
const int MAX_QUEUE_SIZE = 1000000;
State q[MAX_QUEUE_SIZE];
int front = 0, rear = 0;
map<State, bool> vis;
void pour(int &x, int &y, int cap) 
{
    int amt = min(x, cap - y);
    x -= amt;
    y += amt;
}
void jia(State s)
{
    q[rear++] = s;
    if (rear >= MAX_QUEUE_SIZE) rear = 0;
}
State xun() {
    State s = q[front++];
    if (front >= MAX_QUEUE_SIZE) front = 0;
    return s;
}
void bfs() 
{
    jia({0, 0, C, 0});
    vis[{0, 0, C, 0}] = true;
    res = C;
    while (front != rear) 
	{
        State cur = xun();
        if (cur.a > 0 && cur.a < res) 
		{
            res = cur.a;
            steps = cur.steps;
        }
        if (cur.b > 0 && cur.b < res) 
		{
            res = cur.b;
            steps = cur.steps;
        }
        if (cur.c > 0 && cur.c < res) 
		{
            res = cur.c;
            steps = cur.steps;
        }
        if (res == 1) 
			return;
        for (int i = 0; i < 6; i++) 
		{
            State next = cur;
            next.steps++;
            switch (i) 
			{
                case 0: pour(next.a, next.b, B); break;
                case 1: pour(next.a, next.c, C); break;
                case 2: pour(next.b, next.a, A); break;
                case 3: pour(next.b, next.c, C); break;
                case 4: pour(next.c, next.a, A); break;
                case 5: pour(next.c, next.b, B); break;
            }
            if (!vis.count(next)) 
			{
                vis[next] = true;
                jia(next);
            }
        }
    }
}
int main() 
{
    scanf("%d%d%d", &A, &B, &C);
    bfs();
    printf("%d\n%d", res, steps);
    return 0;
}