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