1234D.Distinct Caracteres Consultas (matriz de árbol)

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); 
        } 
    } 
}

 

Supongo que te gusta

Origin www.cnblogs.com/zhanglichen/p/12687506.html
Recomendado
Clasificación