fbpx

Problema #2937 – ora – Rezolvari PBInfo

de Mihai-Alexandru

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';
}
Comentarii

S-ar putea sa iti placa