3526 - StringQuery
Cerinţa[edit | edit source]
Se dă un string s de lungime n și q query-uri de forma (op, x, y), unde op poate fi 0 sau 1. Dacă op este egal cu 1, atunci caracterul de pe poziția x din s va deveni y. Dacă op este egal cu 0, se va afișa numărul de caractere distincte ale lui s din intervalul [x, y].
Date de intrare[edit | edit source]
Programul citește de la tastatură n, s, q si cele q query-uri.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran raspunsurile la query-urile de tipul 0, fiecare pe linie nouă.
Restricţii şi precizări[edit | edit source]
- 1 ≤ n ≤ 5.000.000
- 1 ≤ q ≤ 250.000
- s este format doar din litere mici ale alfabetului englez
Exemplu[edit | edit source]
- Intrare
4 aaaa 4 1 2 b 1 3 c 0 1 2 0 2 4
- Ieșire
2 3
Explicatie[edit | edit source]
După primele 2 operatii, s = "abca".
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def distinct_characters_in_range(s, x, y):
count = {} for i in range(x - 1, y): if s[i] not in count: count[s[i]] = 1 return len(count)
def main():
n = int(input("Introduceți lungimea șirului: ")) s = input("Introduceți șirul: ") q = int(input("Introduceți numărul de query-uri: "))
for _ in range(q): op, x, y = map(int, input().split()) if op == 1: s = s[:x - 1] + chr(y) + s[x:] elif op == 0: result = distinct_characters_in_range(s, x, y) print(result)
if __name__ == "__main__":
main()
</syntaxhighlight>