Dada una string S con letras minúsculas únicamente y Q consultas donde cada consulta contiene un par {L, R} . Para cada consulta {L, R}, existe una substring S[L, R] , la tarea es encontrar el valor del producto de la frecuencia de cada carácter en la substring con su posición en orden alfabético.
Nota: considere la indexación basada en 1.
Ejemplos:
Entrada: S = “abcd”, Q = { {2, 4}, {1, 3} }
Salida: 9 6
Explicación:
Para la primera consulta,
la substring es S[2, 4] = “bcd”. Por lo tanto, la frecuencia de b, c, d es 1, 1, 1 en el rango de 2 a 4.
valor = 2*(1) + 3*(1) + 4*(1) = 9.
Para la segunda consulta,
la substring es S [1, 3] = “abc”. Por lo tanto, la frecuencia de a, b, c son 1, 1, 1 en el rango de 1 a 3.
valor = 1*(1) + 2*(1) + 3*(1) = 6.
Entrada: S = “geeksforgeeks” , Q = { {3, 3}, {2, 6}, {1, 13} }
Salida: 5 46 133
Enfoque ingenuo: la idea ingenua es recorrer para cada rango [L, R] en la consulta y mantener el recuento de cada carácter en una array. Después de recorrer el rango, encuentre el valor de la expresión 1*(ocurrencias de ‘a’) + 2*(ocurrencias de ‘b’) + 3*(ocurrencias de ‘c’) + ..+ 26*(ocurrencias de ‘z ‘) .
Complejidad de tiempo: O(N*Q), donde N es la longitud de la string dada.
Espacio Auxiliar: O(1)
Enfoque Eficiente: La idea es utilizar el Prefijo Suma de toda la string por el cual podemos realizar cada consulta en tiempo constante. A continuación se muestran los pasos:
- Cree una array arr[] de longitud igual a la longitud de la string.
- Recorra la string dada y para cada índice i correspondiente en la string, asigne a arr[i] el valor del carácter actual: ‘a’ .
- Encuentre la suma del prefijo de la array arr[] . Esta array de suma de prefijos dará la suma de ocurrencia de todos los caracteres hasta cada índice i.
- Ahora, para cada consulta (digamos {L, R} ), el valor de arr[R – 1] – arr[L – 2] dará el valor de la expresión dada.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to perform range sum queries // on string as per the given condition void Range_sum_query(string S, vector<pair<int, int> > Query) { // Initialize N by string size int N = S.length(); // Create array A[] for prefix sum int A[N]; A[0] = S[0] - 'a' + 1; // Iterate till N for (int i = 1; i < N; i++) { A[i] = S[i] - 'a' + 1; A[i] = A[i] + A[i - 1]; } // Traverse the queries for (int i = 0; i < Query.size(); i++) { if (Query[i].first == 1) { // Check if L == 1 range // sum will be A[R-1] cout << A[(Query[i].second) - 1] << endl; } else { // Condition if L > 1 range sum // will be A[R-1] - A[L-2] cout << A[(Query[i].second) - 1] - A[(Query[i].first) - 2] << endl; } } } // Driver Code int main() { // Given string string S = "abcd"; vector<pair<int, int> > Query; // Given Queries Query.push_back(make_pair(2, 4)); Query.push_back(make_pair(1, 3)); // Function call Range_sum_query(S, Query); return 0; }
Java
// Java program for the above approach import java.util.*; class GFG{ static class pair { int first, second; public pair(int first, int second) { this.first = first; this.second = second; } } // Function to perform range sum queries // on String as per the given condition static void Range_sum_query(String S, Vector<pair> Query) { // Initialize N by String size int N = S.length(); // Create array A[] for prefix sum int []A = new int[N]; A[0] = S.charAt(0) - 'a' + 1; // Iterate till N for(int i = 1; i < N; i++) { A[i] = S.charAt(i) - 'a' + 1; A[i] = A[i] + A[i - 1]; } // Traverse the queries for(int i = 0; i < Query.size(); i++) { if (Query.get(i).first == 1) { // Check if L == 1 range // sum will be A[R-1] System.out.print( A[(Query.get(i).second) - 1] + "\n"); } else { // Condition if L > 1 range sum // will be A[R-1] - A[L-2] System.out.print( A[(Query.get(i).second) - 1] - A[(Query.get(i).first) - 2] + "\n"); } } } // Driver Code public static void main(String[] args) { // Given String String S = "abcd"; Vector<pair> Query = new Vector<pair>(); // Given Queries Query.add(new pair(2, 4)); Query.add(new pair(1, 3)); // Function call Range_sum_query(S, Query); } } // This code is contributed by Rajput-Ji
Python3
# Python3 program for the above approach # Function to perform range sum queries # on string as per the given condition def Range_sum_query(S, Query): # Initialize N by string size N = len(S) # Create array A[] for prefix sum A = [0] * N A[0] = ord(S[0]) - ord('a') + 1 # Iterate till N for i in range(1, N): A[i] = ord(S[i]) - ord('a') + 1 A[i] = A[i] + A[i - 1] # Traverse the queries for i in range(len(Query)): if(Query[i][0] == 1): # Check if L == 1 range # sum will be A[R-1] print(A[Query[i][1] - 1]) else: # Condition if L > 1 range sum # will be A[R-1] - A[L-2] print(A[Query[i][1] - 1] - A[Query[i][0] - 2]) # Driver Code # Given string S = "abcd" Query = [] # Given Queries Query.append([2, 4]) Query.append([1, 3]) # Function call Range_sum_query(S, Query) # This code is contributed by Shivam Singh
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG{ class pair { public int first, second; public pair(int first, int second) { this.first = first; this.second = second; } } // Function to perform range sum queries // on String as per the given condition static void Range_sum_query(String S, List<pair> Query) { // Initialize N by String size int N = S.Length; // Create array []A for prefix sum int[] A = new int[N]; A[0] = S[0] - 'a' + 1; // Iterate till N for (int i = 1; i < N; i++) { A[i] = S[i] - 'a' + 1; A[i] = A[i] + A[i - 1]; } // Traverse the queries for (int i = 0; i < Query.Count; i++) { if (Query[i].first == 1) { // Check if L == 1 range // sum will be A[R-1] Console.Write(A[(Query[i].second) - 1] + "\n"); } else { // Condition if L > 1 range sum // will be A[R-1] - A[L-2] Console.Write(A[(Query[i].second) - 1] - A[(Query[i].first) - 2] + "\n"); } } } // Driver Code public static void Main(String[] args) { // Given String String S = "abcd"; List<pair> Query = new List<pair>(); // Given Queries Query.Add(new pair(2, 4)); Query.Add(new pair(1, 3)); // Function call Range_sum_query(S, Query); } } // This code is contributed by gauravrajput1
Javascript
<script> // Javascript program for the above approach // Function to perform range sum queries // on string as per the given condition function Range_sum_query(S, Query) { // Initialize N by string size var N = S.length; // Create array A[] for prefix sum var A = Array(N); A[0] = S[0].charCodeAt(0) - 'a'.charCodeAt(0) + 1; // Iterate till N for (var i = 1; i < N; i++) { A[i] = S[i].charCodeAt(0) - 'a'.charCodeAt(0) + 1; A[i] = A[i] + A[i - 1]; } // Traverse the queries for (var i = 0; i < Query.length; i++) { if (Query[i][0] == 1) { // Check if L == 1 range // sum will be A[R-1] document.write( A[(Query[i][1]) - 1]+ "<br>"); } else { // Condition if L > 1 range sum // will be A[R-1] - A[L-2] document.write( A[(Query[i][1]) - 1] - A[(Query[i][0]) - 2]+ "<br>"); } } } // Driver Code // Given string var S = "abcd"; var Query = []; // Given Queries Query.push([2, 4]); Query.push([1, 3]); // Function call Range_sum_query(S, Query); // This code is contributed by itsok. </script>
9 6
Complejidad de tiempo: O(N), donde N es la longitud de la string dada.
Espacio Auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por divyeshrabadiya07 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA