Monday, March 22, 2021

Published March 22, 2021 by Anonymous with 0 comment

Queries to calculate sum of squares of ASCII values of characters of a substring with updates

#include <bits/stdc++.h>

using namespace std;

  

struct treeNode {

    int square_sum;

};

  

void buildTree(string s, treeNode* tree,

               int start, int end,

               int treeNode)

{

    

    if (start == end) {

  

        

        

        tree[treeNode].square_sum

            = pow(s[start] - 'a' + 1, 2);

  

        return;

    }

  

    

    

    int mid = start + ((end - start) / 2);

  

    

    buildTree(s, tree, start,

              mid, 2 * treeNode);

  

    

    buildTree(s, tree, mid + 1,

              end, 1 + 2 * treeNode);

  

    

    tree[treeNode].square_sum

        = tree[(2 * treeNode)].square_sum

          + tree[(2 * treeNode) + 1].square_sum;

}

  

int querySquareSum(treeNode* tree, int start,

                   int end, int treeNode,

                   int l, int r)

{

    

    if ((l > end) || (r < start)) {

        return 0;

    }

  

    

    if ((l <= start) && (r >= end)) {

  

        

        return tree[treeNode].square_sum;

    }

  

    

    int mid = start + ((end - start) / 2);

  

    

    int X = querySquareSum(tree, start,

                           mid, 2 * treeNode,

                           l, r);

  

    

    int Y = +querySquareSum(tree, mid + 1, end,

                            1 + 2 * treeNode, l, r);

  

    

    return X + Y;

}

  

void updateTree(string s, treeNode* tree,

                int start, int end,

                int treeNode, int idx, char X)

{

    

    

    if ((start == end) && (idx == start)) {

  

        

        s[idx] = X;

        tree[treeNode].square_sum

            = pow(X - 'a' + 1, 2);

  

        return;

    }

  

    

    int mid = start + ((end - start) / 2);

  

    

    if (idx <= mid) {

  

        

        updateTree(s, tree, start, mid,

                   (2 * treeNode), idx, X);

    }

  

    

    else {

  

        

        updateTree(s, tree, mid + 1, end,

                   (2 * treeNode) + 1, idx, X);

    }

  

    

    tree[treeNode].square_sum

        = tree[(2 * treeNode)].square_sum

          + tree[(2 * treeNode) + 1].square_sum;

}

  

void PerformQuery(string S,

                  vector<vector<string> > Q)

{

    int n = S.size();

  

    

    treeNode* tree = new treeNode[(4 * n) + 1];

  

    

    for (int i = 0; i <= (4 * n); i = i + 1) {

  

        

        tree[i].square_sum = 0;

    }

  

    

    buildTree(S, tree, 0, n - 1, 1);

  

    

    for (int i = 0; i < Q.size(); i++) {

  

        

        if (Q[i][0] == "S") {

  

            

            int L = stoi(Q[i][1]);

  

            

            int R = stoi(Q[i][2]);

  

            

            

            cout << querySquareSum(tree, 0,

                                   n - 1, 1, L, R)

                 << endl;

        }

  

        

        else if (Q[i][0] == "U") {

  

            

            

            int I = stoi(Q[i][1]);

  

            

            updateTree(S, tree, 0, n - 1,

                       1, I, Q[i][2][0]);

        }

    }

}

  

int main()

{

    

    string S = "geeksforgeeks";

    vector<vector<string> > Q = { { "S", "0", "2" },

                                  { "S", "1", "2" },

                                  { "U", "1", "a" },

                                  { "S", "0", "2" },

                                  { "S", "4", "5" } };

    

    PerformQuery(S, Q);

}

Let's block ads! (Why?)


Original page link

Best Cool Tech Gadgets

Top favorite technology gadgets
      edit

0 comments:

Post a Comment