Rezolvare completă PbInfo #1790 Masaretu

Cercetări recente au scos la iveală un vechi document scris într-un dialect ciudat denumit masaretu. Textul conţinut de acest document este format din cuvinte iar între două cuvinte există cel puţin un spaţiu.

Despre acest dialect se cunosc câteva caracteristici:

  • scrierile din acest dialect folosesc literele mici ale alfabetului englez;
  • toate cuvintele dialectului au exact opt litere;
  • cuvintele dialectului sunt formate din silabe. Fiecare silabă are două litere dintre care una este o vocală (adică una dintre literele a e i o u) iar cealaltă o consoană. Rezultă că fiecare cuvânt are patru silabe.

Din păcate documentul descoperit este deteriorat: din unele cuvinte au dispărut una sau mai multe litere. Astfel în document apar grupuri formate din mai puţin de opt litere care nu mai reprezintă cuvinte ale vocabularului dialectului masaretu.

Cerința

Să se scrie un program care determină:

1) câte cuvinte corecte sunt în documentul recent descoperit.
2) silabele care apar cel mai des în cuvintele corecte din document.

Date de intrare

Fișierul de intrare masaretu.in conține:

  • pe prima linie un număr natural V care poate avea valoarea 1 sau valoarea 2.
  • pe a doua linie un şir de cel mult 1000000 de caractere, care reprezintă textul documentului.

Date de ieșire

Fișierul de ieșire masaretu.out va avea o singură linie cu următorul conţinut:

  • dacă V = 1, atunci pe această linie se va scrie un număr care reprezintă răspunsul la prima cerință a problemei – adică numărul de cuvinte corecte din textul dat.
  • dacă V = 2, atunci pe prima linie a fişierului de ieşire se vor scrie în ordine alfabetică toate silabele care apar cel mai des în cuvintele corecte ale textului dat.

Restricții și precizări

  • textul de pe a doua linie din fişier începe şi se termină cu o literă;
  • în textul dat există cel puţin un cuvânt corect al dialectului masaretu;
  • 20% din teste vor avea valoarea V=1, iar 80% din teste vor avea valoarea V=2.

Exemplul 1

masaretu.in

1
masaretu mare dialectu andiculu tare

masaretu.out

3

Explicație

V=1, deci se rezolvă NUMAI prima cerinţă.

Sunt trei cuvinte corecte: masaretu dialectu andiculu

Exemplul 2

masaretu.in

2
masaretu mare dialectu andiculu tare

masaretu.out

di tu

Explicație

V=2, deci se rezolvă NUMAI a doua cerinţă.

Silabele care apar cel mai des in cele trei cuvinte corecte sunt di si tu. Ambele apar de două ori.

Nu se numără silabele care apar în cuvintele incorecte! Silaba re se va număra doar o dată în cuvântul corect masaretu şi nu se va număra în cuvintele incomplete mare şi tare.

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 Masaretu:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int v,n;
string cuvant;
int silabect[30][30];
char litera1, litera2;
int linie, coloana, cuvintect, maxim;
ifstream  fin("masaretu.in");
ofstream fout("masaretu.out");

int main()
{
    fin >> v;
    while (fin >> cuvant)
    {
        if (cuvant.size() == 8)
        {

            cuvintect++;
            for (int i=0;i<8;i=i+2)
            {
                litera1 = cuvant[i];
                litera2 = cuvant[i+1];
                linie = litera1 - 'a';
                coloana = litera2-'a';
               // cout << litera1<<litera2<< linie << ' ' << coloana << endl;
                silabect[linie][coloana]++;
                if (silabect[linie][coloana] > maxim)
                    maxim = silabect[linie][coloana];
            }
        }
    }
    if (v==1)
    {
        //cout << cuvintect << endl;
        fout << cuvintect << endl;
        return 0;
    }
    for (int i=0;i<30;i++)
        for (int j=0;j<30;j++)
            if (silabect[i][j] == maxim)
            {
                litera1 = i+'a';
                litera2 = j+'a';
                //cout << litera1 <<litera2<< ' ';
                fout << litera1 <<litera2<< ' ';
            }
    //cout << endl;
    fout << endl;

    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 #1790 Masaretu

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1790 Masaretu 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!