<?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=3065_-_trio</id>
	<title>3065 - trio - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3065_-_trio"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3065_-_trio&amp;action=history"/>
	<updated>2026-05-01T10:58: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=3065_-_trio&amp;diff=9925&amp;oldid=prev</id>
		<title>Benzar Ioan: Pagină nouă: == Cerința == Trio este un joc ce conține N piese de aceeași formă, așezate una lângă alta pe o tablă de joc și numerotate de la stânga la dreapta cu valori de la 1 la N. Fiecare piesă are marcate pe ea trei zone, iar în fiecare dintre ele este scrisă câte o cifră. Se consideră că o piesă pe care sunt scrise în ordine, de la stânga la dreapta, cifrele C1, C2 și C3 are următoarele proprietăți: este identică cu o altă piesă, dacă această piesă con...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3065_-_trio&amp;diff=9925&amp;oldid=prev"/>
		<updated>2024-06-03T03:53:24Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Cerința == Trio este un joc ce conține N piese de aceeași formă, așezate una lângă alta pe o tablă de joc și numerotate de la stânga la dreapta cu valori de la 1 la N. Fiecare piesă are marcate pe ea trei zone, iar în fiecare dintre ele este scrisă câte o cifră. Se consideră că o piesă pe care sunt scrise în ordine, de la stânga la dreapta, cifrele C1, C2 și C3 are următoarele proprietăți: este identică cu o altă piesă, dacă această piesă con...&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;
Trio este un joc ce conține N piese de aceeași formă, așezate una lângă alta pe o tablă de joc și numerotate de la stânga la dreapta cu valori de la 1 la N. Fiecare piesă are marcate pe ea trei zone, iar în fiecare dintre ele este scrisă câte o cifră. Se consideră că o piesă pe care sunt scrise în ordine, de la stânga la dreapta, cifrele C1, C2 și C3 are următoarele proprietăți:&lt;br /&gt;
este identică cu o altă piesă, dacă această piesă conține exact aceleași cifre, în aceeași ordine cu ale ei sau în ordine inversă. Astfel, piesa C1|C2|C3 este identică cu o altă piesă de forma C1|C2|C3 și cu o piesă de forma C3|C2|C1.&lt;br /&gt;
este prietenă cu o altă piesă dacă aceasta conține exact aceleași cifre ca piesa dată, dar nu neapărat în aceeași ordine. Astfel, piesa C1|C2|C3 este prietenă cu piesele: C1|C2|C3, C1|C3|C2, C2|C1|C3, C2|C3|C1, C3|C1|C2 și C3|C2|C1. Se observă că două piese identice sunt și prietene!&lt;br /&gt;
Un grup de piese prietene este format din TOATE piesele prietene între ele, aflate pe tabla de joc.&lt;br /&gt;
1) Alegeți o piesă de pe tabla de joc, astfel încât numărul M al pieselor identice cu ea să fie cel mai mare posibil și afișați numărul M determinat;&lt;br /&gt;
2) Afișați numărul grupurilor de piese prietene existente pe tabla de joc;&lt;br /&gt;
3) Afișați numărul maxim de piese dintr-o secvență ce conține piese așezate una lângă alta pe tabla de joc, pentru care prima piesă și ultima piesă din secvență sunt prietene.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare trio.in conține&lt;br /&gt;
- pe prima linie un număr natural C care reprezintă numărul cerinţei şi poate avea valorile 1, 2 sau 3.&lt;br /&gt;
- pe cea de-a doua linie un număr natural N ce reprezintă numărul pieselor de joc;&lt;br /&gt;
- pe următoarele N linii, câte trei cifre, despărțite prin câte un spațiu, ce reprezintă, în ordine, cifrele scrise pe câte o piesă de joc. Piesele sunt date în ordinea numerotării acestora pe tabla de joc.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire trio.out va conține pe prima linie un singur număr natural ce reprezintă rezultatul determinat conform fiecărei cerințe.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
*2 ≤ N ≤ 100.000&lt;br /&gt;
*Există cel puțin două piese identice pe tabla de joc;&lt;br /&gt;
*O piesă ce nu e prietenă cu nicio altă piesă de pe tabla de joc formează singură un grup;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
;Intrare&lt;br /&gt;
1&amp;lt;br&amp;gt;&lt;br /&gt;
6&amp;lt;br&amp;gt;&lt;br /&gt;
1 3 3&amp;lt;br&amp;gt;&lt;br /&gt;
4 5 9&amp;lt;br&amp;gt;&lt;br /&gt;
1 3 3&amp;lt;br&amp;gt;&lt;br /&gt;
9 5 4&amp;lt;br&amp;gt;&lt;br /&gt;
3 3 1&amp;lt;br&amp;gt;&lt;br /&gt;
9 4 5&lt;br /&gt;
;Iesire&lt;br /&gt;
2&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def reverse_piece(piece):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Returnează piesa inversată.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return piece[::-1]&lt;br /&gt;
&lt;br /&gt;
def are_friends(piece1, piece2):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifică dacă două piese sunt prietene.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if piece1 == piece2:&lt;br /&gt;
        return True&lt;br /&gt;
    if piece1 == reverse_piece(piece2):&lt;br /&gt;
        return True&lt;br /&gt;
    c1, c2, c3 = piece1&lt;br /&gt;
    for i in range(3):&lt;br /&gt;
        if piece2 == c2 + c3 + c1 or piece2 == c3 + c1 + c2:&lt;br /&gt;
            return True&lt;br /&gt;
        c1, c2, c3 = c3, c1, c2  # permutăm cifrele&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def cerinta1(pieces):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Determină M al pieselor identice cu cea selectată.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    from collections import Counter&lt;br /&gt;
    counter = Counter(pieces)&lt;br /&gt;
    most_common_piece, count = counter.most_common(1)[0]&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def cerinta2(pieces):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Numărul grupurilor de piese prietene.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    n = len(pieces)&lt;br /&gt;
    visited = [False] * n&lt;br /&gt;
&lt;br /&gt;
    def dfs(i):&lt;br /&gt;
        stack = [i]&lt;br /&gt;
        while stack:&lt;br /&gt;
            node = stack.pop()&lt;br /&gt;
            if not visited[node]:&lt;br /&gt;
                visited[node] = True&lt;br /&gt;
                for j in range(n):&lt;br /&gt;
                    if not visited[j] and are_friends(pieces[node], pieces[j]):&lt;br /&gt;
                        stack.append(j)&lt;br /&gt;
&lt;br /&gt;
    groups = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if not visited[i]:&lt;br /&gt;
            groups += 1&lt;br /&gt;
            dfs(i)&lt;br /&gt;
&lt;br /&gt;
    return groups&lt;br /&gt;
&lt;br /&gt;
def cerinta3(pieces):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Numărul maxim de piese dintr-o secvență ce conține piese prietene.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    n = len(pieces)&lt;br /&gt;
    max_length = 0&lt;br /&gt;
    current_length = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if i == 0 or are_friends(pieces[i], pieces[i - 1]):&lt;br /&gt;
            current_length += 1&lt;br /&gt;
        else:&lt;br /&gt;
            max_length = max(max_length, current_length)&lt;br /&gt;
            current_length = 1&lt;br /&gt;
&lt;br /&gt;
    max_length = max(max_length, current_length)&lt;br /&gt;
    return max_length&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;#039;trio.in&amp;#039;, &amp;#039;r&amp;#039;) as f:&lt;br /&gt;
        data = f.read().splitlines()&lt;br /&gt;
&lt;br /&gt;
    c = int(data[0].strip())&lt;br /&gt;
    n = int(data[1].strip())&lt;br /&gt;
    pieces = [line.strip().replace(&amp;quot; &amp;quot;, &amp;quot;&amp;quot;) for line in data[2:2 + n]]&lt;br /&gt;
&lt;br /&gt;
    assert 2 &amp;lt;= n &amp;lt;= 100000, &amp;quot;N trebuie să fie între 2 și 100000&amp;quot;&lt;br /&gt;
    assert all(len(piece) == 3 for piece in pieces), &amp;quot;Fiecare piesă trebuie să aibă exact 3 cifre&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if c == 1:&lt;br /&gt;
        result = cerinta1(pieces)&lt;br /&gt;
    elif c == 2:&lt;br /&gt;
        result = cerinta2(pieces)&lt;br /&gt;
    elif c == 3:&lt;br /&gt;
        result = cerinta3(pieces)&lt;br /&gt;
    else:&lt;br /&gt;
        raise ValueError(&amp;quot;C trebuie să fie 1, 2 sau 3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;#039;trio.out&amp;#039;, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{result}\n&amp;quot;)&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>Benzar Ioan</name></author>
	</entry>
</feed>