1711 - Siruri concatenate

De la Universitas MediaWiki

Cerinţa

Scrieţi un program care citeşte din fişierul de intrare mai multe şiruri de caractere formate din litere mici ale alfabetului englez şi determină câte dintre acestea sunt formate din două şiruri identice (cu lungimea cel puţin 1) concatenate.

Date de intrare

Fișierul de intrare siruri_concatenatein.txt conține pe prima linie un număr natural nenul n, iar pe următoarele n linii câte un şir format din litere mici ale alfabetului englez.

Date de ieșire

Fișierul de ieșire siruri_concatenateout.txt va conține pe prima linie numărul de şiruri din fişierul de intrare care sunt formate din două şiruri identice concatenate.

Restricţii şi precizări

  • 1 ⩽ n ⩽ 1000000
  • şirurile au cel mult 5000 de caractere.

Exemplu 1

siruri_concatenatein.txt
5
sirsir
micropico
pp
vara
nanonano
siruri_concatenateout.txt
Datele de intrare corespund restrictiilor impuse
3


Exemplu 2

siruri_concatenatein.txt
-5
sirsir
micropico
pp
vara
nanonano
siruri_concatenateout.txt
Datele de intrare nu corespund restrictiilor impuse


Explicatie

Cele 3 şiruri din fişier obţinute prin concatenarea a două şiruri identice sunt: sirsir (sir), pp (p) şi nanonano (nano).

Rezolvare

def is_concatenated(s):
    # Verifică dacă șirul s este format din două șiruri identice concatenate
    n = len(s)
    if n % 2 != 0:
        return False
    return s[:n//2] == s[n//2:]


def main():
    with open('siruri_concatenatein.txt', 'r') as fin, open('siruri_concatenateout.txt', 'w') as fout:
        n = int(fin.readline().strip())
        siruri = [fin.readline().strip() for _ in range(n)]

        # Verifică dacă șirurile respectă restricțiile
        if not (1 <= n <= 1000000) or any(not s.islower() or len(s) > 5000 for s in siruri):
            fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
            return

        fout.write("Datele de intrare corespund restrictiilor impuse\n")

        # Numără șirurile care sunt formate din două șiruri identice concatenate
        nr = sum(is_concatenated(s) for s in siruri)
        fout.write(str(nr) + '\n')


if __name__ == "__main__":
    main()