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.
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 valoarea1
sau valoarea2
. - 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 valoareaV=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
.
#include <bits/stdc++.h> using namespace std; ifstream cin("masaretu.in"); ofstream cout("masaretu.out"); char s[1000001]; int f[10000]; int main() { int c; cin >> c; cin.getline(s , 10000); cin.getline(s , 1000001); int i = 0; int cnt=0 , conto=0; while(s[i]!='\0') { if(s[i]==' ') { if(cnt==8) conto++; cnt=0; } else { cnt++; } i++; } if(cnt==8) conto++; if(c==1) cout << conto; s[i]=' ' , s[i+1]='\0'; i = 0; int j = 0; cnt=0 , conto=0; while(s[i]!='\0') { if(s[i]==' ') { if(cnt==8) { conto++; int cn=0; int nr=0; while(j < i) { nr = nr * 100 + ((int)s[j]-96); cn++; if(cn == 2) { f[nr]++; cn=0 , nr = 0; } j++; } } cnt=0; j=i+1; } else { cnt++; } i++; } int fmax = 0 , nr ; for(int i = 100 ; i < 3000 ; ++i) { if(f[i] > fmax) fmax=f[i]; } if(c==2) for(int i = 100 ; i < 3000 ; ++i) if(f[i]==fmax) cout << ((char)(i/100 + 96)) << ((char)(i % 100 + 96)) << ' '; return 0; }