251
Gigel este la ora de informatică, iar profesorul i-a cerut să sorteze numele celor n colegi ai săi după o regulă specială. Fiecărui nume i se asociază un număr care iniţial este 0 și crește cu 1 pentru fiecare pereche de vocale consecutive și scade cu 1 pentru fiecare pereche de consoane consecutive din nume. Dacă perechea este formată dintr-o vocală și o consoană, numărul nu se modifică.
Cerința
Dându-se cele n nume ale colegilor, să se sorteze crescător după numerele asociate. La numere egale, se vor sorta alfabetic.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n nume, fiecare pe câte o linie nouă.
Date de ieșire
Programul va afișa pe ecran cele n nume sortate, pe linii separate.
Restricții și precizări
1 ≤ n ≤ 300.000;- numele conțin cel mult
20de caractere; - numele copiilor sunt distincte două câte două.
Exemplu
Intrare
5 George Steve Jotaro Aeioubc Star
Ieșire
Star Steve George Jotaro Aeioubc
Explicație
Numerele corespunzătoare sunt în ordine: 0,-1,0,3,-1.
#include <bits/stdc++.h>
using namespace std;
struct poz
{
char val[25];
int nr;
}t[300001];
int voc(char s)
{
if( s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u' || s == 'A' || s == 'E' || s == 'I' || s == 'O' || s == 'U') return 1;
else return 0;
}
int comp(char a , char b)
{
if(voc(a) && voc(b)) return 1;
if(!voc(a) && !voc(b)) return -1;
else return 0;
}
int compara(poz a , poz b)
{
if(a.nr > b.nr) return 1;
else if(a.nr == b.nr && strcmp(a.val , b.val) > 0) return 1;
else return 0;
}
int main()
{
int n;
char s[300001][25];
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
cin >> s[i];
int j = 1 , sum = 0;
while(s[i][j] != '\0')
{
sum += comp(s[i][j - 1] , s[i][j]);
j++;
}
strcpy(t[i].val , s[i]);
t[i].nr = sum;
}
sort(t+1 , t + n + 1 , compara);
for(int i = n ; i > 0 ; i--)
cout << t[i].val << '\n';
}
Comentarii