1711 - Siruri concatenate
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>