<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1215_-_Mesaj</id>
	<title>1215 - Mesaj - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1215_-_Mesaj"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1215_-_Mesaj&amp;action=history"/>
	<updated>2026-05-01T02:53:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1215_-_Mesaj&amp;diff=9623&amp;oldid=prev</id>
		<title>Raul: Pagină nouă: În țara lui Piticot cuvintele au doar două litere, prima fiind o majusculă (literă mare) iar a doua o minusculă (literă mică). Piticii &#039;&#039;Mi&#039;&#039; și &#039;&#039;Gi&#039;&#039; se distrează și își trimit mesaje ascunzând cuvintele în cadrul unor secvențe transmise sub forma unor șiruri de litere. Piticul &#039;&#039;Mi&#039;&#039; scrie și trimite un mesaj piticului &#039;&#039;Gi&#039;&#039; respectând următoarele reguli:  * un mesaj conține una sau mai multe secvențe; * orice literă care apare în mesaj, de cel pu...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1215_-_Mesaj&amp;diff=9623&amp;oldid=prev"/>
		<updated>2024-02-12T15:19:16Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: În țara lui Piticot cuvintele au doar două litere, prima fiind o majusculă (literă mare) iar a doua o minusculă (literă mică). Piticii &amp;#039;&amp;#039;Mi&amp;#039;&amp;#039; și &amp;#039;&amp;#039;Gi&amp;#039;&amp;#039; se distrează și își trimit mesaje ascunzând cuvintele în cadrul unor secvențe transmise sub forma unor șiruri de litere. Piticul &amp;#039;&amp;#039;Mi&amp;#039;&amp;#039; scrie și trimite un mesaj piticului &amp;#039;&amp;#039;Gi&amp;#039;&amp;#039; respectând următoarele reguli:  * un mesaj conține una sau mai multe secvențe; * orice literă care apare în mesaj, de cel pu...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;În țara lui Piticot cuvintele au doar două litere, prima fiind o majusculă (literă mare) iar a doua o minusculă (literă mică). Piticii &amp;#039;&amp;#039;Mi&amp;#039;&amp;#039; și &amp;#039;&amp;#039;Gi&amp;#039;&amp;#039; se distrează și își trimit mesaje ascunzând cuvintele în cadrul unor secvențe transmise sub forma unor șiruri de litere. Piticul &amp;#039;&amp;#039;Mi&amp;#039;&amp;#039; scrie și trimite un mesaj piticului &amp;#039;&amp;#039;Gi&amp;#039;&amp;#039; respectând următoarele reguli:&lt;br /&gt;
&lt;br /&gt;
* un mesaj conține una sau mai multe secvențe;&lt;br /&gt;
* orice literă care apare în mesaj, de cel puțin două ori, pe poziții alăturate, este numită terminator;&lt;br /&gt;
* o secvență se  încheie când s-a întâlnit o succesiune de litere terminator;&lt;br /&gt;
* cuvântul este format din prima majusculă și ultima minusculă din secvență, fără a lua în seamă litera terminator a secvenței;&lt;br /&gt;
* o secvență ascunde un cuvânt dacă terminatorul său se repetă de exact două ori și dacă conține cel puțin o literă mare și o literă mică, ignorând terminatorul de secvență;&lt;br /&gt;
* costul unui cuvânt este egal cu numărul total de apariții al celor două litere din care este format, în cadrul secvenței în care a fost ascuns, luând în considerare inclusiv literele terminator.&lt;br /&gt;
&lt;br /&gt;
De exemplu secvența  &amp;lt;code&amp;gt;s f u E e t R u E E&amp;lt;/code&amp;gt; ascunde un cuvânt deoarece conține și majuscule și minuscule, iar litera terminator de secvență,  &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;, se repetă de exact două ori. Secvența ascunde cuvântul &amp;lt;code&amp;gt;Eu&amp;lt;/code&amp;gt;, iar costul cuvântului este &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; două litere &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
La primirea mesajului, piticul &amp;#039;&amp;#039;Gi&amp;#039;&amp;#039; determină, pentru fiecare majusculă, costul maxim al cuvintelor care încep cu aceasta.&lt;br /&gt;
&lt;br /&gt;
= Cerinţe =&lt;br /&gt;
Scrieţi un program care determină:&lt;br /&gt;
&lt;br /&gt;
1) numărul de secvențe trimise care nu ascund cuvinte;&lt;br /&gt;
&lt;br /&gt;
2) cuvintele din mesaj, în ordinea în care au fost trimise de piticul &amp;#039;&amp;#039;Mi&amp;#039;&amp;#039;; &lt;br /&gt;
&lt;br /&gt;
3) pentru fiecare majusculă, câte cuvinte care încep cu ea au costul maxim determinat de &amp;#039;&amp;#039;Gi&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
fi afișate în ordine de la &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;, însă doar cele pentru care au existat în mesaj cuvinte care au început cu ele.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;mesaj.in&amp;lt;/code&amp;gt; conţine pe prima linie un număr natural &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;. Pentru toate testele de intrare, numărul &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; poate avea numai una dintre valorile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Pe a doua linie a fișierului de intrare se găsește  numărul natural N reprezentând numărul de litere folosite de &amp;#039;&amp;#039;Mi&amp;#039;&amp;#039; pentru scrierea mesajului. Pe a treia linie se găsesc &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; litere mari și mici ale alfabetului englez, separate prin câte un spațiu, reprezentând literele mesajului, în ordinea în care au fost trimise.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, se va rezolva numai punctul 1) din cerințe. În acest caz, fişierul de ieşire &amp;lt;code&amp;gt;mesaj.out&amp;lt;/code&amp;gt; va conține pe prima linie un număr natural reprezentând răspunsul la cerinţa 1).&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, se va rezolva numai punctul 2) din cerințe. În acest caz, fişierul de ieşire &amp;lt;code&amp;gt;mesaj.out&amp;lt;/code&amp;gt; va conține cuvintele din mesaj, fiecare cuvânt scris pe câte o linie, în ordinea în care au fost trimise.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, se va rezolva numai punctul 3) din cerințe. În acest caz, fişierul de ieşire &amp;lt;code&amp;gt;mesaj.out&amp;lt;/code&amp;gt; va conține pe fiecare linie câte o majusculă urmată de un număr natural nenul, separate printr-un spațiu. Majusculele vor fi afișate în ordine de la &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;, însă doar cele pentru care au existat în mesaj cuvinte care au început cu ele.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 2000000&amp;lt;/code&amp;gt;&lt;br /&gt;
* litera terminator a unei secvențe poate fi ori minusculă ori majusculă;&lt;br /&gt;
* ultimele litere din fișier sunt literele terminator ale ultimei secvențe din mesajul trimis; se garantează că în șirul de litere din fișierul de intrare se află ascuns cel puțin un cuvânt;&lt;br /&gt;
* majusculele alfabetului englez sunt &amp;lt;code&amp;gt;A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pentru 50% din teste &amp;lt;code&amp;gt;N ≤ 1000000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru rezolvarea cerinţei 1) se acordă 20 de puncte, pentru rezolvarea cerinţei 2) se acordă 40 de puncte, iar pentru rezolvarea cerinţei 3) se acordă 40 de puncte.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;mesaj.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 34&lt;br /&gt;
 w w w w e D o r F D o r r t R n e R e y y j j i M &lt;br /&gt;
&lt;br /&gt;
 o e i t t t j w w&lt;br /&gt;
&amp;lt;code&amp;gt;mesaj.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Textul conține șase secvențe:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;w w w w&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;e D o r F D o r r&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;t R n e R e y y&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;j j&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;i M o e i t t t&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;j w w&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sunt &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; secvențe care nu ascund cuvinte:&lt;br /&gt;
&lt;br /&gt;
* prima secvență și a patra deoarece conțin numai terminatorul;&lt;br /&gt;
* secvența a cincea nu se decodifică deoarece terminatorul se repetă de mai mult de două ori;&lt;br /&gt;
* secvența a șasea nu conține majuscule.&lt;br /&gt;
&lt;br /&gt;
== Încărcare soluție ==&lt;br /&gt;
&lt;br /&gt;
=== Lipește codul aici ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import string&lt;br /&gt;
&lt;br /&gt;
in_file = open(&amp;quot;mesaj.in&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
out_file = open(&amp;quot;mesaj.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
maj_counts = [0] * 256&lt;br /&gt;
min_counts = [0] * 256&lt;br /&gt;
max_cost = [0] * 256&lt;br /&gt;
max_cost_counts = [0] * 256&lt;br /&gt;
&lt;br /&gt;
P = int(in_file.readline())&lt;br /&gt;
N = int(in_file.readline())&lt;br /&gt;
&lt;br /&gt;
num_secvente = 0&lt;br /&gt;
num_secvente_cu_cuvinte = 0&lt;br /&gt;
&lt;br /&gt;
ch = &amp;#039;#&amp;#039;&lt;br /&gt;
count_ch = 1&lt;br /&gt;
&lt;br /&gt;
maj_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
min_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    peek_ch = in_file.read(1)&lt;br /&gt;
    if i == N - 1:&lt;br /&gt;
        peek_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if ch == peek_ch:&lt;br /&gt;
        count_ch += 1&lt;br /&gt;
    else:&lt;br /&gt;
        if count_ch == 1:&lt;br /&gt;
            if P == 1 or P == 2 or P == 3:&lt;br /&gt;
                if ch.isupper() and maj_ch == &amp;#039;#&amp;#039;:&lt;br /&gt;
                    maj_ch = ch&lt;br /&gt;
                if ch.islower():&lt;br /&gt;
                    min_ch = ch&lt;br /&gt;
            if P == 3:&lt;br /&gt;
                if ch.isupper():&lt;br /&gt;
                    maj_counts[ord(ch)] += 1&lt;br /&gt;
                if ch.islower():&lt;br /&gt;
                    min_counts[ord(ch)] += 1&lt;br /&gt;
&lt;br /&gt;
        elif count_ch == 2:&lt;br /&gt;
            if P == 1:&lt;br /&gt;
                num_secvente += 1&lt;br /&gt;
                if maj_ch != &amp;#039;#&amp;#039; and min_ch != &amp;#039;#&amp;#039;:&lt;br /&gt;
                    num_secvente_cu_cuvinte += 1&lt;br /&gt;
                maj_ch = min_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
            elif P == 2:&lt;br /&gt;
                if maj_ch != &amp;#039;#&amp;#039; and min_ch != &amp;#039;#&amp;#039;:&lt;br /&gt;
                    out_file.write(maj_ch + min_ch + &amp;#039;\n&amp;#039;)&lt;br /&gt;
                maj_ch = min_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
            elif P == 3:&lt;br /&gt;
                if ch.isupper():&lt;br /&gt;
                    maj_counts[ord(ch)] += 2&lt;br /&gt;
                if ch.islower():&lt;br /&gt;
                    min_counts[ord(ch)] += 2&lt;br /&gt;
                if maj_ch != &amp;#039;#&amp;#039; and min_ch != &amp;#039;#&amp;#039;:&lt;br /&gt;
                    cost = maj_counts[ord(maj_ch)] + min_counts[ord(min_ch)]&lt;br /&gt;
                    if cost &amp;gt; max_cost[ord(maj_ch)]:&lt;br /&gt;
                        max_cost[ord(maj_ch)] = cost&lt;br /&gt;
                        max_cost_counts[ord(maj_ch)] = 1&lt;br /&gt;
                    elif cost == max_cost[ord(maj_ch)]:&lt;br /&gt;
                        max_cost_counts[ord(maj_ch)] += 1&lt;br /&gt;
                maj_ch = min_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
                maj_counts = [0] * 256&lt;br /&gt;
                min_counts = [0] * 256&lt;br /&gt;
&lt;br /&gt;
        else:&lt;br /&gt;
            if P == 1:&lt;br /&gt;
                num_secvente += 1&lt;br /&gt;
                maj_ch = min_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
            elif P == 2:&lt;br /&gt;
                maj_ch = min_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
            elif P == 3:&lt;br /&gt;
                maj_ch = min_ch = &amp;#039;#&amp;#039;&lt;br /&gt;
                maj_counts = [0] * 256&lt;br /&gt;
                min_counts = [0] * 256&lt;br /&gt;
&lt;br /&gt;
        count_ch = 1&lt;br /&gt;
        ch = peek_ch&lt;br /&gt;
&lt;br /&gt;
if P == 1:&lt;br /&gt;
    out_file.write(str(num_secvente - num_secvente_cu_cuvinte) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
elif P == 3:&lt;br /&gt;
    for ch in string.ascii_uppercase:&lt;br /&gt;
        if max_cost[ord(ch)]:&lt;br /&gt;
            out_file.write(ch + &amp;#039; &amp;#039; + str(max_cost_counts[ord(ch)]) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
in_file.close()&lt;br /&gt;
out_file.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raul</name></author>
	</entry>
</feed>