3904 - SeqCuts
Cerința[edit | edit source]
Se dă un șir de N caractere, format din litere mici ale alfabetului englez, din care trebuie eliminate K secvențe disjuncte de lungime L. Care este cel mai mic şir din punct de vedere lexicografic ce se poate obține după eliminarea celor K secvențe.
Date de intrare[edit | edit source]
Prima linie conține numărul de caractere N al şirului, numărul K al secvențelor care trebuie eliminate şi numărul L al lungimii unei secvențe ce trebuie eliminate. Cea de-a doua linie conţine N litere mici ale alfabetului englez, neseparate prin spaţii.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran cel mai mic şir din punct de vedere lexicografic ce se poate obține după eliminările făcute.
Restricții și precizări[edit | edit source]
- 1 ≤ N ≤ 2.000.000
- 0 ≤ K * L < N
- șirul de caractere este format din litere mici ale alfabetului englez
Exemplu 1[edit | edit source]
- Intrare
10 3 2
anaaremere
- Iesire
aaae
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def main():
# Citirea datelor de intrare N, K, L = map(int, input().strip().split()) sir = input().strip()
# Verificăm restricțiile assert 1 <= N <= 2000000, "N trebuie sa fie intre 1 si 2.000.000" assert 0 <= K * L < N, "0 <= K * L < N trebuie să fie adevărat" assert all('a' <= c <= 'z' for c in sir), "Șirul trebuie să conțină doar litere mici ale alfabetului englez"
# Calculăm lungimea finală a șirului după eliminarea K secvențe de lungime L lungime_finala = N - K * L stiva = [] eliminari = 0
for i, caracter in enumerate(sir): while stiva and eliminari < K * L and stiva[-1] > caracter and len(stiva) + len(sir) - i - 1 >= lungime_finala: stiva.pop() eliminari += 1 if len(stiva) < lungime_finala: stiva.append(caracter) else: eliminari += 1
print("".join(stiva))
if __name__ == "__main__":
main()
</syntaxhighlight>