<?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=3845_-_Ciurulet</id>
	<title>3845 - Ciurulet - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3845_-_Ciurulet"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3845_-_Ciurulet&amp;action=history"/>
	<updated>2026-05-01T14:49:01Z</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=3845_-_Ciurulet&amp;diff=9974&amp;oldid=prev</id>
		<title>RebecaBud: Pagină nouă: == Cerinţa == Popel, elev de liceu calificat la barajul pentru Lotul Național de Informatică, tocmai a învățat ciurul lui Eratostene, pentru aflarea numerelor prime, al cărui algoritm este descris astfel:    prim[i]=1, oricare ar fi i de la 2 la N   pentru i de la 2 la N:       dacă prim[i] este 1:           pentru j de la 2*i la N din i în i:               prim[j] = 0 Din cauza oboselii și a stresului, Popel a inițializat greșit șirul prim, punând pe unele pozi...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3845_-_Ciurulet&amp;diff=9974&amp;oldid=prev"/>
		<updated>2024-06-03T15:52:41Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Cerinţa == Popel, elev de liceu calificat la barajul pentru Lotul Național de Informatică, tocmai a învățat ciurul lui Eratostene, pentru aflarea numerelor prime, al cărui algoritm este descris astfel:    prim[i]=1, oricare ar fi i de la 2 la N   pentru i de la 2 la N:       dacă prim[i] este 1:           pentru j de la 2*i la N din i în i:               prim[j] = 0 Din cauza oboselii și a stresului, Popel a inițializat greșit șirul prim, punând pe unele pozi...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Popel, elev de liceu calificat la barajul pentru Lotul Național de Informatică, tocmai a învățat ciurul lui Eratostene, pentru aflarea numerelor prime, al cărui algoritm este descris astfel:&lt;br /&gt;
&lt;br /&gt;
  prim[i]=1, oricare ar fi i de la 2 la N&lt;br /&gt;
  pentru i de la 2 la N:&lt;br /&gt;
      dacă prim[i] este 1:&lt;br /&gt;
          pentru j de la 2*i la N din i în i:&lt;br /&gt;
              prim[j] = 0&lt;br /&gt;
Din cauza oboselii și a stresului, Popel a inițializat greșit șirul prim, punând pe unele poziții 0 în loc de 1. După ce a executat algoritmul pe șirul prim greșit inițializat, a obținut un nou șir pe care l-a notat pe o foaie de hârtie. Mai târziu, nu își mai amintea șirul inițial prim, dar mai avea șirul final pe care l-a obținut. În plus, nu mai era sigur dacă unele valori din șirul final le-a notat corect, așa că le-a marcat cu caracterul &amp;quot;?&amp;quot;. Popel vă roagă să aflați un șir inițial cu proprietatea că dacă ar executa algoritmul de mai sus asupra lui, ar obține un șir care s-ar potrivi cu șirul final notat pe foaie. De asemenea, el își dorește ca șirul inițial să aibă un număr cât mai mare de cifre de 1.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului ciurulet.in se va afla numărul N reprezentând valoarea până la care se&lt;br /&gt;
execută algoritmul.&lt;br /&gt;
Următoarea linie conține N-1 caractere din mulțimea {0, 1, ?}, fără spații între ele, reprezentând șirul notat pe foaie. Caracterul ? indică un caracter pe care Popel nu și-l mai amintește (adică Popel nu mai știe dacă acolo era 0 sau 1). Al i-lea caracter dintre acestea reprezintă valoarea lui prim[i+1]. Dacă aceasta este diferită de ?, atunci Popel și-o amintește exact. Altfel, acolo ar fi putut fi orice (0 sau 1).&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe prima linie a fișierului ciurulet.out se va afla numărul maxim de cifre de 1 care pot apărea într-un șir&lt;br /&gt;
inițial din care se obține un șir final care se potrivește cu cel notat pe foaie.&lt;br /&gt;
Pe a doua linie se vor afișa N-1 caractere din mulțimea {0, 1}, fără spații între ele, care reprezintă șirul inițial folosit.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2 ≤ N ≤ 1.000.000.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru 30% din teste, șirul din fișierul de intrare nu conține caracterul ?.&lt;br /&gt;
* Pentru ca două șiruri A și B să se potrivească, trebuie ca A[i] și B[i] să fie egale, oricare ar fi i de la 2 la N cu B[i] diferit de ?. Cu alte cuvinte, peste 0 se potrivește 0, peste 1 se potrivește 1, iar peste ? se potrivesc atât 0, cât și 1.&lt;br /&gt;
* Se garantează faptul că șirul final obținut notat pe foaie este unul valid.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; ciurulet.in&lt;br /&gt;
&lt;br /&gt;
  9&lt;br /&gt;
  ??10?00?&lt;br /&gt;
;ciurulet.out&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
  01101011&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Aplicând algoritmul de mai sus asupra șirului 01101011 se obține în final șirul &amp;#039;&amp;#039;&amp;#039;01100000&amp;#039;&amp;#039;&amp;#039;, care se potrivește cu ce și-a notat Popel pe foaie.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; ciurulet.in&lt;br /&gt;
&lt;br /&gt;
  9&lt;br /&gt;
  ??10?00?&lt;br /&gt;
; ciurulet.out&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
  01101011&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Aplicând algoritmul de mai sus asupra șirului 01101011 se obține în final șirul &amp;#039;&amp;#039;&amp;#039;01100000&amp;#039;&amp;#039;&amp;#039;, care se potrivește cu ce și-a notat Popel pe foaie.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def find_max_ones(N, sequence):&lt;br /&gt;
    max_ones = 0&lt;br /&gt;
    max_ones_index = 0&lt;br /&gt;
    current_ones = 0&lt;br /&gt;
    current_index = 0&lt;br /&gt;
    &lt;br /&gt;
    for i in range(N - 1):&lt;br /&gt;
        if sequence[i] == &amp;#039;1&amp;#039;:&lt;br /&gt;
            current_ones += 1&lt;br /&gt;
        elif sequence[i] == &amp;#039;0&amp;#039;:&lt;br /&gt;
            current_ones -= 1&lt;br /&gt;
        &lt;br /&gt;
        if current_ones &amp;gt; max_ones:&lt;br /&gt;
            max_ones = current_ones&lt;br /&gt;
            max_ones_index = current_index&lt;br /&gt;
        &lt;br /&gt;
        current_index += 1&lt;br /&gt;
    &lt;br /&gt;
    return max_ones, max_ones_index&lt;br /&gt;
&lt;br /&gt;
def generate_initial_sequence(N, sequence):&lt;br /&gt;
    initial_sequence = [&amp;#039;0&amp;#039;] * N&lt;br /&gt;
    max_ones, max_ones_index = find_max_ones(N, sequence)&lt;br /&gt;
    &lt;br /&gt;
    current_ones = max_ones&lt;br /&gt;
    for i in range(max_ones_index, -1, -1):&lt;br /&gt;
        if sequence[i] == &amp;#039;?&amp;#039;:&lt;br /&gt;
            initial_sequence[i] = &amp;#039;1&amp;#039;&lt;br /&gt;
            current_ones -= 1&lt;br /&gt;
        elif sequence[i] == &amp;#039;0&amp;#039;:&lt;br /&gt;
            current_ones += 1&lt;br /&gt;
    &lt;br /&gt;
    for i in range(max_ones_index + 1, N):&lt;br /&gt;
        if sequence[i - 1] == &amp;#039;?&amp;#039;:&lt;br /&gt;
            initial_sequence[i] = &amp;#039;1&amp;#039;&lt;br /&gt;
        elif sequence[i - 1] == &amp;#039;1&amp;#039;:&lt;br /&gt;
            initial_sequence[i] = &amp;#039;1&amp;#039; if current_ones &amp;gt; 0 else &amp;#039;0&amp;#039;&lt;br /&gt;
            current_ones -= 1&lt;br /&gt;
    &lt;br /&gt;
    return &amp;#039;&amp;#039;.join(initial_sequence)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;ciurulet.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
        sequence = fin.readline().strip()&lt;br /&gt;
    &lt;br /&gt;
    max_ones, _ = find_max_ones(N, sequence)&lt;br /&gt;
    initial_sequence = generate_initial_sequence(N, sequence)&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;ciurulet.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(max_ones) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        fout.write(initial_sequence)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
</feed>