3153 - eliminaren

De la Universitas MediaWiki

Cerința

Se citesc de la tastatură un cuvânt s format din litere mici distincte și un număr natural n. Să se afișeze pe ecran toate cuvintele care se pot obține din s eliminând exact n litere.

Eliminarea se face începând cu literele de la sfârșitul cuvântului, iar ordinea din cuvânt a literelor nu se schimbă (vezi explicația din exemplu).

Date de intrare

Programul citește de la tastatură cuvântul s și numărul n.

Date de ieșire

Programul va afișa pe ecran pe rânduri separate cuvintele care se pot obține din s eliminând exact n litere.

Restricții și precizări

  • Cuvântul s are cel mult 20 de litere
  • Cuvântul s este format din litere mici distincte
  • 1 <= n < numărul de litere ale lui s

Exemplu:

Intrare

dorel 2

Ieșire

dor
doe
dol
dre
drl
del
ore
orl
oel
rel

Explicație

Din cele 5 litere se elimina două, astfel:

dor – se elimina a 4-a si a 5-a litera

doe – se elimina a 3-a si a 5-a litera

dol – se elimina a 3-a si a 4-a litera

dre

drl

del

ore

orl

oel – se elimina prima si a 3-a litera

rel – se elimina prima si a 2-a litera

Rezolvare

def afisare(s, x, n, c):
    rezultat = ''.join(s[x[i] - 1] for i in range(1, n - c + 1))
    print(rezultat)

def bectreching(k, s, x, n, c):
    for i in range(x[k - 1] + 1, n + 1):
        x[k] = i
        if k < n - c:
            bectreching(k + 1, s, x, n, c)
        else:
            afisare(s, x, n, c)

def verifica_restrictii(s, c):
    if len(s) > 20 or not s.islower() or len(s) != len(set(s)) or not (1 <= c < len(s)):
        return False
    return True

def main():
    intrare = input().strip().split()
    s = intrare[0]
    c = int(intrare[1])
    if not verifica_restrictii(s, c):
        print("Datele nu corespund restrictiilor impuse")
        return
    
    n = len(s)
    x = [0] * (n + 1)
    bectreching(1, s, x, n, c)

if __name__ == "__main__":
    main()