3398 - Kps

From Bitnami MediaWiki

Un cuvânt se numește k-ps dacă prefixul său de lungime k este identic cu sufixul de lungime k, iar k este cea mai mare valoare strict mai mică decât lungimea cuvântului, cu această proprietate. Dacă nu există nicio astfel de valoare k nenulă, spunem despre cuvânt că este 0-ps. De exemplu, amalgam este 2-ps, iar amestec este 0-ps.

Cerinţa[edit | edit source]

Rezolvați următoarele cerințe:

1) Se dă un cuvânt. Determinați k asfel încât cuvântul să fie k-ps.

2) Se dă un șir de caractere în care cuvintele sunt alcătuite din litere mici ale alfabetului englez și sunt separate prin spații. Să se afișeze în ordine cuvintele 0-ps, 1-ps, 2-ps, 3-ps, etc, până la cel mai mare k pentru care există în șir cel puțin un cuvânt k-ps. Pentru fiecare categorie, cuvintele vor fi afișate în ordine alfabetică.

Date de intrare[edit | edit source]

Fișierul de intrare kpsin.txt conține pe prima linie numărul C, care reprezintă cerința și poate fi 1 sau 2.
  • Dacă C=1, a doua linie conține un cuvânt format litere mici ale alfabetului englez.
  • daca C=2, a doua linie conține șir de caractere în care cuvintele sunt alcătuite din litere mici ale alfabetului englez și sunt separate prin spații.

Date de ieșire[edit | edit source]

  • Dacă C=1, fișierul de ieșire kpsout.txt va conține pe prima linie numărul K, astel încât cuvântul dat este cuvânt K-ps. Dacă cuvântul dat nu este cuvânt k-ps, se va afișa valoarea 0.
  • Dacă C=2, fișierul de ieșire kpsout.txt va conține mai multe linii:
  • prima linie corespunde cuvintelor 0-ps, a doua corespunde cuvintelor 1-ps, a treia cuvintelor 2-ps, etc.
  • fiecare linie începe cu numărul de cuvinte din categoria curentă, urmat de un spațiu și de aceste cuvinte, in ordine alfabetică, separate prin câte un spațiu;
  • dacă nu există niciun cuvânt dintr-o anumită categorie, linia corespunzătoare va conține doar valoarea 0.

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

  • pentru C=1, cuvântul dat va avea cel mult 1000 de litere;
  • pentru C=2, șirul dat va avea cel mult 10000 de caractere, fiecare cuvânt având cel mult 100 de litere;
  • pentru 50 de puncte, C=1.

Exemplu 1[edit | edit source]

kpsin.txt
1
amalgam
kpsout.txt
Datele de intrare corespund restrictiilor impuse
2


Exemplu 2[edit | edit source]

kpsin.txt
2
asdfqwasdf zar amalgam  zarzar  barbar ghjtttyuttghj asaswasas kps
kpsout.txt
Datele de intrare corespund restrictiilor impuse
2 kps zar
0
1 amalgam
3 barbar ghjtttyuttghj zarzar
2 asaswasas asdfqwasdf

Exemplu 3[edit | edit source]

kpsin.txt
1
ASD SCCS
kpsout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def k_ps(cuvant):

   # Determină k pentru care cuvântul este k-ps
   for k in range(len(cuvant) - 1, 0, -1):
       if cuvant[:k] == cuvant[-k:]:
           return k
   return 0


def sortare_cuvinte(sir):

   # Sortează cuvintele în funcție de valoarea k
   cuvinte = sir.split()
   k_cuvinte = {k: [] for k in range(max(map(k_ps, cuvinte)) + 1)}
   for cuvant in cuvinte:
       k_cuvinte[k_ps(cuvant)].append(cuvant)
   for k in k_cuvinte:
       k_cuvinte[k].sort()
   return k_cuvinte


def main():

   with open('kpsin.txt', 'r') as fin, open('kpsout.txt', 'w') as fout:
       c = int(fin.readline().strip())
       # Verifică dacă datele de intrare respectă restricțiile
       if c == 1:
           cuvant = fin.readline().strip()
           if len(cuvant) > 1000 or not cuvant.islower():
               fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
               return
           fout.write("Datele de intrare corespund restrictiilor impuse\n")
           fout.write(str(k_ps(cuvant)) + '\n')
       elif c == 2:
           sir = fin.readline().strip()
           if len(sir) > 10000 or not all(cuvant.islower() for cuvant in sir.split()):
               fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
               return
           fout.write("Datele de intrare corespund restrictiilor impuse\n")
           k_cuvinte = sortare_cuvinte(sir)
           for k in k_cuvinte:
               fout.write(str(len(k_cuvinte[k])) + ' ' + ' '.join(k_cuvinte[k]) + '\n')


if __name__ == "__main__":

   main()


</syntaxhighlight>