func_code_string: #include <bits/stdc++.h>   using namespace std;   struct Compteur {     int nbs[4];     Compteur() {       for (int iCoeff = 0; iCoeff < 4; iCoeff++) {         nbs[iCoeff] = 0;       }     }   };   Compteur operator+(const Compteur &a, const Compteur &b) {     Compteur nouv;     for (int iCoeff = 0; iCoeff < 4; iCoeff++) {       nouv.nbs[iCoeff] = a.nbs[iCoeff] + b.nbs[iCoeff];     }     return nouv;   }   int getP2(int a) {     int s = 1;     while (s < a) {       s *= 2;     }     return s;   }   vector<Compteur> arbres[10][10];   void modif(vector<Compteur> &a, int pos, Compteur val) {     pos += (int)a.size() / 2;     while (pos != 0) {       a[pos] = a[pos] + val;       pos /= 2;     }   }   Compteur getSomme(vector<Compteur> &a, int deb, int fin) {     deb += (int)a.size() / 2;     fin += (int)a.size() / 2;     Compteur somme;     while (deb < fin) {       if (deb % 2 == 1) {         somme = somme + a[deb];         deb++;       }       if (fin % 2 == 1) {         fin--;         somme = somme + a[fin];       }       deb /= 2;       fin /= 2;     }     return somme;   }   int conv[256];   int main() {     string chaine;     cin >> chaine;     conv[ A ] = 0;     conv[ T ] = 1;     conv[ G ] = 2;     conv[ C ] = 3;     for (int iTaille = 1; iTaille <= 10; iTaille++) {       for (int iMod = 0; iMod < iTaille; iMod++) {         arbres[iTaille - 1][iMod] = vector<Compteur>(             2 * getP2((chaine.size() + iTaille) / iTaille), Compteur());       }     }     for (int iCar = 0; iCar < chaine.size(); iCar++) {       Compteur nouv;       nouv.nbs[conv[chaine[iCar]]]++;       for (int iTaille = 1; iTaille <= 10; iTaille++) {         int mod = iCar % iTaille;         int pos = iCar / iTaille;         modif(arbres[iTaille - 1][mod], pos, nouv);       }     }     int nbReqs;     cin >> nbReqs;     for (int iReq = 0; iReq < nbReqs; iReq++) {       int type;       cin >> type;       if (type == 1) {         int iCar;         char val;         cin >> iCar >> val;         iCar--;         Compteur nouv;         nouv.nbs[conv[val]]++;         nouv.nbs[conv[chaine[iCar]]]--;         for (int iTaille = 1; iTaille <= 10; iTaille++) {           int mod = iCar % iTaille;           int pos = iCar / iTaille;           modif(arbres[iTaille - 1][mod], pos, nouv);         }         chaine[iCar] = val;       } else {         int deb, fin;         string comp;         cin >> deb >> fin >> comp;         deb--;         int iTaille = comp.size();         int somme = 0;         for (int iMod = 0; iMod < iTaille; iMod++) {           int mod = (deb + iMod) % iTaille;           int debPos = (deb + iMod) / iTaille;           int finPos = (fin - iTaille) / iTaille;           while (finPos * iTaille + mod < fin) {             finPos++;           }           Compteur vals = getSomme(arbres[iTaille - 1][mod], debPos, finPos);           somme += vals.nbs[conv[comp[iMod]]];         }         cout << somme << endl;       }     }   }   