Pagini recente » Cod sursa (job #293980) | Cod sursa (job #1396452) | Cod sursa (job #1215510) | Cod sursa (job #2603809) | Cod sursa (job #2487080)
#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;
if (len % 2 == 0)
{
ok = (f[mx] <= len / 2);
}
else
{
ok = (f[mx] <= len / 2 + (mx != c));
}
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;
}