Cod sursa(job #111913)
#include<stdio.h>
#include<string.h>
int h[26],l=-1,p,g; //histrograma, lungime, pimu
char ch,x[1000*1000+2];
void citire()
{
for (int i=0;i<26;i++) h[i]=0;
freopen("ordine.in","r",stdin);
while (scanf("%c",&ch)==1) h[ch-97]++;
fclose(stdin);
for (int i=0;i<26;i++)
{
for (int j=0;j<h[i];j++)
{
l++;
x[l]=97+i;
x[l+1]='\0';
};
};
};
void interschimba(char &e,char &f)
{
char aux;
aux=e;e=f;f=aux;
}
void ordin(int &i)
{
p=1;
if (x[i]==x[i+1])
{
p++;
while (x[i]==x[i+p]) p++;
if (l+1-i-p>=p-1)
{
for (int j=1;j<p;j+=1) interschimba(x[i-1+j*2],x[i+p-1+j]);
i=i+2*p-1;
}
else
{
for (int k=0;k<p;k++)
interschimba(x[i+k],x[l-k]);
for (int j=1;j<p;j+=1) interschimba(x[l+1-j*2],x[l-p+1-j]);
i=l;
}
}
};
int main()
{
citire();
g=0;
while (g<l)
{
ordin(g);
g++;
}
freopen("ordine.out","w",stdout);
puts(x);
fclose(stdout);
return 0;
}