Pagini recente » Cod sursa (job #177487) | Cod sursa (job #2057447) | Cod sursa (job #1684263) | Cod sursa (job #1920045) | Cod sursa (job #530089)
Cod sursa(job #530089)
#include<fstream>
#define dmax 1000010
#define dmax2 30
using namespace std;
typedef struct litera
{
char lit;
int apar;
} litera;
litera l[dmax2];
int lg,k;
char sol[dmax];
void citire()
{
char s[dmax];
int i,j,ok;
ifstream fin("ordine.in");
fin.get(s,dmax);
fin.close();
lg = strlen(s);
for (i=0; i<lg; i++)
{
ok=0;
for (j=1; j<=k; j++)
if (l[j].lit == s[i])
{
l[j].apar++;
ok=1;
}
if (ok == 0)
{
k++;
l[k].apar = 1;
l[k].lit = s[i];
}
}
}
bool comp(litera a, litera b)
{
return a.lit < b.lit;
}
void solve()
{
int i,j,ok;
for (i=0; i<lg; i++)
{
ok=0;
for (j=1; j<=k; j++) /*verific daca am vreo litera care trebuie pusa urgent*/
if (l[j].apar > ((lg - i) / 2))
{
sol[i] = l[j].lit;
l[j].apar--;
ok=1;
break;
}
if (ok == 0)
for (j=1; j<=k; j++) /*caut prima litera care inca nu i-am epuizat toate aparitiile si care este diferita fata de precedenta*/
if (l[j].apar != 0 && l[j].lit != sol[i-1])
{
sol[i] = l[j].lit;
l[j].apar--;
break;
}
}
}
void afisare()
{
ofstream fout("ordine.out");
fout<<sol;
fout.close();
}
int main()
{
citire();
sort(l+1, l+k+1, comp);
solve();
afisare();
return 0;
}