1711 - Siruri concatenate

From Bitnami MediaWiki

Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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

Exemplu 1[edit | edit source]

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


Exemplu 2[edit | edit source]

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


Explicatie[edit | edit source]

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

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> 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()

</syntaxhighlight>