fbpx

Problema #859 – Rime – Rezolvari PBInfo

de Mihai-Alexandru

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.

Exemplu

rime.in

6
lopata, baiat parchet 
concret , bucata; apret

rime.out

3
apret concret parchet 
baiat 
bucata lopata 
#include <bits/stdc++.h>

using namespace std;

ifstream cin("rime.in");
ofstream cout("rime.out");

char m[501][21];
char suf[501][10];

int main()
{
    int n;
    cin >> n;
    for(int i = 1 ; i <= n ; ++i)
    {
        cin >> m[i];
        int j = strlen(m[i]);
        j--;
        while(!strchr("qwertyuiopasdfghjklzxcvbnm" , m[i][j]) && j >= 0)
            j--;
        if(m[i][j]<=0)
            i--;
        else
        j++ , m[i][j]='\0';
    }
    for(int i = 1 ; i < n ; ++i)
        for(int j = i+1 ; j <= n ; ++j)
            if(strcmp(m[i] , m[j]) > 0)
                swap(m[i] , m[j]);
    for(int i = 1 ; i <= n ; ++i)
    {
        int x = strlen(m[i]);
        int j = strlen(m[i]);
        j--;
        if(strchr("aeiou" , m[i][j]))
        {
            if(strlen(m[i]) > 1)
                j--;
            while(!strchr("aeiou" , m[i][j]) && j > 0)
                j--;
            int q = 0;
            for(int k = j ; k < x ; ++k)
                suf[i][q] = m[i][k] , q++;
            suf[i][q]='\0';
        }
        else
        {
            if(strlen(m[i]) > 1)
                j--;
            while(!strchr("aeiou" , m[i][j]) && j > 0)
                j--;
            int q = 0;
            for(int k = j ; k < x ; ++k)
                suf[i][q]=m[i][k] , q++;
            suf[i][q]='\0';
        }
    }
    int cnt = 0;
    for(int i = 1 ; i <= n ; ++i)
    {
        bool ok = true;
        for(int j = i+1 ; j <= n ; ++j)
            if(strcmp(suf[i] , suf[j])==0)
                ok=false;
        if(ok)
            cnt++;
    }
    cout << cnt << '\n';
    for(int i = 1 ; i <= n ; ++i)
    {
        if(suf[i][0]!='0')
        {
            cout << m[i] << ' ';
            for(int j = i + 1 ; j <= n ; ++j)
                if(strcmp(suf[i] , suf[j]) == 0)
                    cout << m[j] << ' ' , suf[j][0]='0';
            cout << endl;
        }
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa