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); }