Rezolvare completă PbInfo #859 Rime

Spunem că două cuvinte rimează dacă se termină cu consoană și începând de la ultima vocală sunt identice sau se termină cu vocală și începând de la penultima vocală sunt identice. De exemplu: concret rimează cu parchet (cazul 1), iar lopata rimează cu bucata (cazul 2).

Cerința

Se dă o mulțime cu n cuvinte distincte. Să se împartă în submulțimi de cuvinte cu proprietatea că oricare două cuvinte din aceeași submulțime rimează și oricare două cuvinte care rimează sunt în aceeași submulțime.

Date de intrare

Fișierul de intrare rime.in conține pe prima linie numărul n, iar pe următoarele linii cele n cuvinte. Este posibil să existe mai multe cuvinte pe aceeași linie (caz în care cuvintele sunt separate prin spațiu, virgula (,) sau punct virgula (;) )

Date de ieșire

Fișierul de ieșire rime.out va conține pe prima linie numărul C de mulțimi determinate.
Următoarele C linii conțin câte o mulțime. Cuvintele din aceeași mulțime sunt ordonate lexicografic și separate prin exact un spațiu, iar mulțimile sunt date în ordine lexicografică după primul cuvânt.

Restricții și precizări

  • 1 ≤ n ≤ 500;
  • cuvintele sunt format din cel mult 20 de litere din alfabetul englez;
  • toate liniile din fișierul de intrare conțin cel mult 255 caractere.

Exemplu

rime.in

6
lopata, baiat parchet 
concret , bucata; apret

rime.out

3
apret concret parchet 
baiat 
bucata lopata 

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

#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

ifstream fin("rime.in");
ofstream fout("rime.out");

int n, v[505];
char s[505][21];

bool rimeaza(char * s , char * t)
{
    int nrv = 1;
    if(strchr("aeiou" , s[strlen( s ) - 1]))
        nrv = 2;
    int i = strlen(s) - 1, j = strlen(t) - 1;
    while(nrv)
        if(s[i]!=t[j])
            return false;
        else{
            if(strchr("aeiou", s[i]))
                nrv --;
            i-- , j --;
        }
    return true;
}

int main()
{
    int m = 0;
    char linie[256];
    char * p;
    fin >> n;
    fin.getline(linie , 256);
    while(fin.getline(linie , 256))
    {
        p = strtok( linie , " ;,");
        while(p)
        {
            strcpy(s[m] , p);
            m ++;
            p = strtok(NULL, " ;,");
        }
    }
    char t[21];
    for (int i = 0 ; i < n - 1 ; i ++)
        for(int j = i + 1 ; j < n ; j ++)
            if(strcmp(s[i] , s[j]) > 0)
            {
                strcpy(t , s[i]); strcpy(s[i], s[j]); strcpy(s[j] , t);
            }
    int c = 0;
    for(int i = 0 ; i < n ; i ++)
        if(v[i] == 0)
        {
            c ++;
            v[i] = c;
            for(int j = i + 1; j < n ; j ++)
                if(rimeaza(s[i] , s[j]))
                    v[j] = c;
        }
    fout << c << "
";
    for(int i = 1 ; i <= c ; i ++)
    {
        for(int j = 0 ; j < n ; j ++)
            if(v[j] == i)
                fout << s[j] << " ";
        fout << "
";
    }
    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 #859 Rime

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