Tiene un alfabeto latino en minúsculas compuesto por una cadena syq para consultar esta cadena.
Recuerde que la subcadena s [l; r] de la cadena s es la cadena slsl + 1 ... sr. Por ejemplo, la subcadena de "codeforce" es "code", "force", "f", "For", no "coder" y "top".
Hay dos tipos de consultas:
1 pos c (1≤pos≤ | s |, c es una letra latina en minúscula): reemplace spos con c (set spos: = c);
2 lr (1≤l≤r≤ | s |): Calcule el número de caracteres diferentes en la subcadena s [l; r].
Solución:
Abra 26 matrices de árboles, almacene el prefijo de 26 letras.
#include <bits / stdc ++. h> usando el espacio de nombres std; const int maxn = 1e5 + 100 ; cuerda s; int c [ 26 ] [maxn]; int len; int lowbit ( int x) { return x & - x; } actualización nula ( int id, int x, int val) { for ( int i = x; i <= len; i + = lowbit (i)) c [id] [i] + = val; } int getsum ( int id, int x) { int ans = 0 ; para ( int i = x; i; i- = lowbit (i)) ans + = c [id] [i]; volver ans; } int main () { cin >> s; int N; scanf ( " % d " , & N); len = s.length (); para ( int i = 1 ; i <= len; i ++ ) actualizar (s [i - 1 ] - ' a ' , i, 1 ); para ( inti = 1 ; i <= N; i ++ ) { int f; scanf ( " % d " , & f); if (f == 1 ) { int x; char ch; scanf ( " % d% c " , & x, & ch); actualización (s [x - 1 ] - ' a ' , x, - 1 ); actualización (ch - ' a ' , x, 1 ); s [x - 1] = ch; } else { int l, r; scanf ( " % d% d " , & l, & r); int ans = 0 ; para ( int j = 0 ; j < 26 ; j ++ ) { if (getsum (j, r) -getsum (j, l- 1 )> = 1 ) ans ++ ; } printf ( " % d \ n " , ans); } } }