Rezolvare completă PbInfo #2937 ora

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.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema ora:

///Varianta cu sort-ul din STL (80 de puncte)
#include <iostream>
#include <algorithm>
using namespace std;
int n;
string voc="aeiouAEIOU";
struct str{
    string s;
    int v;
}s[1000001];
bool srt(str a,str b){
    return !((a.v>b.v)||(a.v==b.v&&a.s>b.s));
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s[i].s;
        for(int j=1;s[i].s[j];j++){
            if(voc.find(s[i].s[j])==string::npos&&voc.find(s[i].s[j-1])==string::npos){
                s[i].v--;
            }
            else if(voc.find(s[i].s[j])!=string::npos&&voc.find(s[i].s[j-1])!=string::npos){
                s[i].v++;
            }
        }
    }
    sort(s+1,s+n+1,srt);
    for(int i=1;i<=n;i++){
        cout<<s[i].s<<'\n';
    }
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2937 ora

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2937 ora de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!