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
20
de 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'; }