3904 - SeqCuts: Difference between revisions
Benzar Ioan (talk | contribs) Pagină nouă: == Cerința == Într-un tărâm digital, există o aplicație numită SeqCuts, care ajută programatorii să manipuleze și să analizeze siruri de caractere. Programatorii pot folosi SeqCuts pentru a găsi și a înlocui secvențe de caractere în cadrul unui text. Sarcina este de a implementa această funcționalitate pentru a ajuta utilizatorii să manipuleze siruri de caractere conform cerințelor. == Date de intrare == Programul citește de la tastatură: Un șir de car... |
Benzar Ioan (talk | contribs) No edit summary |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
== Cerința == | == Cerința == | ||
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 == | == Date de intrare == | ||
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 == | == Date de ieșire == | ||
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 == | == Restricții și precizări == | ||
*1 | *1 ≤ N ≤ 2.000.000 | ||
* | *0 ≤ K * L < N | ||
* | *șirul de caractere este format din litere mici ale alfabetului englez | ||
== Exemplu 1 == | == Exemplu 1 == | ||
;Intrare | ;Intrare | ||
10 3 2 <br> | |||
anaaremere | |||
;Iesire | ;Iesire | ||
aaae | |||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
def | 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: | |||
print(" | eliminari += 1 | ||
print("".join(stiva)) | |||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 22:10, 2 June 2024
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>