Pagini recente » Cod sursa (job #2519335) | Cod sursa (job #3126101) | Cod sursa (job #2209965) | Cod sursa (job #1370039) | Cod sursa (job #2487081)
#include <iostream>
#include <cstdio>
using namespace std;
string s;
int f[26];
int calc_max()
{
int ans = 0;
for (int i = 1; i < 26; i++)
{
if (f[i] > f[ans])
{
ans = i;
}
}
return ans;
}
int calc_max2(int mx1)
{
int ans = 25 - mx1;
for (int i = 0; i < 26; i++)
{
if (i != mx1 && f[i] > f[ans])
{
ans = i;
}
}
return ans;
}
bool ok(int len, int c, int mx1, int mx2)
{
f[c]--;
int mx;
if (f[mx1] > f[mx2])
{
mx = mx1;
}
else
{
mx = mx2;
}
bool ok = (f[mx] <= len / 2 + ((mx != c) && (len % 2)));
f[c]++;
return ok;
}
int main()
{
freopen ("ordine.in", "r", stdin);
freopen ("ordine.out", "w", stdout);
cin >> s;
for (auto &x : s)
{
f[x - 'a']++;
}
int n = (int) s.size(), last = -1;
for (int i = 1; i <= n; i++)
{
int mx1 = calc_max(), mx2 = calc_max2(mx1);
for (int c = 0; c < 26; c++)
{
if (c != last && f[c] && ok(n - i, c, mx1, mx2))
{
f[c]--;
cout << (char) (c + 'a');
last = c;
break;
}
}
}
return 0;
}