0861 - Dublare

De la Universitas MediaWiki

Cerința

Fie un șir de caractere. Prin dublarea șirului înțelege oglindirea sa și concatenarea oglinditului la șirul inițial. De exemplu, prin dublarea șirului arc se obține șirul arccra. Orice șir de caractere se poate obține prin dublarea de un număr de ori (eventual de zero ori) a unui șir de caractere.

Se dă un șir de caractere s. Să se determine numărul maxim de operații de dublare care pot fi aplicate succesiv pentru a obține șirul s.

Date de intrare

Programul citește de la tastatură șirul s, format din litere mici ale alfabetului englez.

Date de ieșire

Programul va afișa pe ecran numărul M, reprezentând numărul maxim de operații de dublare prin care se poate obține s.

Restricții și precizări:

  • șirul s va avea cel mult 255 caractere

Exemplu 1

Intrare
abba
Iesire
Numarul maxim de operatii de dublare este: 1

Exemplu 2

Intrare
abc#
Iesire
Șirul de caractere trebuie să conțină doar litere mici ale alfabetului englez.

Explicație

Sirul initial este ab. Dupa o dublare devine abba.

Rezolvare

#861 Dublare
import string

def numar_maxim_dublari(s):
    lungime_s = len(s)
    
    for lungime in range(1, lungime_s + 1):
        substr = s[:lungime]
        
        if s == substr * (lungime_s // lungime):
            return lungime_s // lungime

    return 1

def validate_input(s):
    if not s:
        return False, "Șirul de caractere nu poate fi gol."

    if not all(ch in string.ascii_lowercase for ch in s):
        return False, "Șirul de caractere trebuie să conțină doar litere mici ale alfabetului englez."

    return True, None

def main():
    s = input("Introduceți șirul de caractere: ")

    is_valid, error_message = validate_input(s)

    if not is_valid:
        print("Date de intrare invalide:", error_message)
        return

    rezultat = numar_maxim_dublari(s)
    print("Numărul maxim de operații de dublare este:", rezultat)

if __name__ == "__main__":
    main()