3492 - PalPal

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dă un șir s care conține litere mici ale alfabetului englez, urmat de un număr natural k. Să se afișeze câte subsecvențe ale șirului s de lungime 1, 2, … k sunt palindromuri.

Date de intrare[edit | edit source]

Fișierul de intrare palpalin.txt conține pe prima linie un șir s și pe următoarea linie un număr natural k.

Date de ieșire[edit | edit source]

Fișierul de ieșire palpalout.txt va conține k linii. Pe linia i (1 ≤ i ≤ k) se va găsi numărul de subsecvențe de i caractere care sunt palindromuri.

Restricţii şi precizări[edit | edit source]

  • 1 ⩽ k ⩽ 1000
  • șirul s are maxim 20000 de caractere
  • Prin subsecvență a unui șir de caractere se înțelege o succesiune de unul sau mai multe caractere din șir aflate pe poziții consecutive.
  • Un șir de caractere este palindrom dacă se citește la fel de la stânga la dreapta și de la dreapta la stânga.

Exemplu 1[edit | edit source]

palpalin.txt'
eaaebeadaebcc
5
palpalout.txt
Datele de intrare corespund restrictiilor impuse
13
2
2
1
2


Exemplu 2[edit | edit source]

palpalin.txt'
eaaebeadaebcc
-5
palpalout.txt
Datele de intrare nu corespund restrictiilor impuse


Explicatie[edit | edit source]

Subsecvențe palindrom de lungime 1: e, a, a, e, b, e, a, d, a, e, b, c, c.

Subsecvențe palindrom de lungime 2: aa, cc.

Subsecvențe palindrom de lungime 3: ebe, ada.

Subsecvențe palindrom de lungime 4: eaae.

Subsecvențe palindrom de lungime 5: aebea, eadae.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def is_palindrome(s):

   #Verifică dacă un șir de caractere este palindrom.
   return s == s[::-1]

def count_palindromic_subsequences(s, k):

   #Numără subsecvențele palindromice de lungime 1, 2, ..., k ale unui șir.
   counts = [0] * k
   for length in range(1, k + 1):
       for i in range(len(s) - length + 1):
           if is_palindrome(s[i:i+length]):
               counts[length-1] += 1
   return counts

def main():

   with open('palpalin.txt', 'r') as fin, open('palpalout.txt', 'w') as fout:
       s = fin.readline().strip()
       k = int(fin.readline().strip())
       # Verifică dacă datele de intrare respectă restricțiile
       if len(s) > 20000 or k < 1 or k > 1000:
           fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
           return
       fout.write("Datele de intrare corespund restrictiilor impuse\n")
       # Numără subsecvențele palindromice și scrie rezultatele în fișierul de ieșire
       counts = count_palindromic_subsequences(s, k)
       for count in counts:
           fout.write(str(count) + '\n')

if __name__ == "__main__":

   main()


</syntaxhighlight>