fbpx

Problema #1093 – Text – Rezolvari PBInfo

de Mihai-Alexandru

Ion Petre, ca oricare adolescent, este pasionat atât de jocuri, cât şi de informatică. Ultimul astfel de joc este acela de a elimina dintr-un text cuvinte astfel încât fiecare cuvânt rămas să fie urmat de un cuvânt care începe cu aceeaşi literă cu care se termină cuvântul precedent. Face excepţie de la această regulă numai ultimul cuvânt.

Cerinţă

Pentru un text dat, se cere să se afişeze numărul de cuvinte din text, apoi numărul minim de cuvinte ce pot fi eliminate astfel încât în textul rămas orice cuvânt (cu excepţia ultimului) să se termine cu aceeaşi literă cu care începe cuvântul următor, iar în final să se afişeze cuvintele din text rămase după eliminare, fiecare cuvânt fiind afişat pe câte o linie.

Date de intrare

Fișierul de intrare text.in conține un text scris pe mai multe linii. Pe fiecare linie se află cuvinte formate din litere mici ale alfabetului latin. Cuvintele sunt despărţite între ele prin exact câte un spaţiu.

Date de ieșire

Fișierul de ieșire text.out va conține pe primele doua linii două numerele x şi y, unde x va fi numărul de cuvinte din text, iar y numărul minim de cuvinte ce trebuie eliminate. Pe liniile următoare se vor afişa, în ordine, cuvintele rămase după eliminarea celor y cuvinte, câte un cuvânt pe o linie.

Restricții și precizări

  • Numărul de cuvinte din text este maximum 20000.
  • Lungimea maximă a unui cuvânt este 20.
  • Fiecare linie de text din fişierul de intrare are cel mult 200 de caractere.
  • În fişier pot exista rânduri goale.
  • Se acordă 10% din punctaj pentru determinarea corectă a numărului de cuvinte din text.
  • Se acordă 40% din punctaj pentru rezolvarea corectă a primelor două cerinţe.
  • Pentru rezolvarea corectă a tuturor cerinţelor se acordă tot punctajul.

Exemplu

text.in

pentru ca nu are 

timp ion spune ca nu urmareste nici
emisiuni interesante si evident nici altfel
de

emisiuni

text.out

19
13
ion
nu
urmareste
emisiuni
interesante
evident

Explicație

Din întregul text care este format din 19 cuvinte se elimină 13 cuvinte şi se obţin, în ordine, cuvintele: ion, nu, urmareste, emisiuni, interesante, evident.

#include <bits/stdc++.h>

using namespace std;

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

int n , start , lstart;
string S[20001] , s;
int l[20001];///lungimile cuvinteor
int lmax[128] , pmax[128];///pt fiecare lit sirul de lung max
int L[20001] , T[20001];///L de la SCLM , tata
void afis(int i)
{
    if(T[i]) afis(T[i]);
    cout << S[i] << '\n';
}
int main()
{
    while(cin >> s)
    {
        S[++n] = s;
        l[n]= s.length();
    }
    for(int i = 1; i <= n ;i++)
    {
        char c = S[i][0];///prima litera
        L[i] = lmax[c] + 1;///creste cu 1
        T[i] = pmax[c];///anteriorul
        c = S[i][l[i] - 1];///ultima
        if(L[i]> lmax[c])
        {
            lmax[c] = L[i];
            pmax[c] = i;
        }
        if(lmax[c] > lstart)///pt casastiu de unde pornesc
        {
            lstart = lmax[c];
            start = pmax[c];
        }

    }
    cout << n << '\n' << n-lstart << '\n';
    afis(start);

}
Comentarii

S-ar putea sa iti placa