Tuesday, 26 Oct 2021

# Count of substrings with the frequency of at most one character as Odd

Given a string S of N characters, the task is to calculate the total number of non-empty substrings such that at most one character occurs an odd number of times.Example: Input: S = “aba”Output: 4Explanation: The valid substrings are “a”, “b”, “a”, and “aba”. Therefore, the total number of required substrings are 4.Input: “aabb”Output: 9Explanation: The valid substrings are “a”, “aa”, “aab”, “aabb”, “a”, “abb”, “b”, “bb”, and “b”.Approach: The above problem can be solved with the help of Bit Masking using HashMaps. Follow the below-mentioned steps to solve the problem:The parity of the frequency of each character can be stored in a bitmask mask, where the ith character is represented by 2i. Initially the value of mask = 0. Create an unordered map seen, which stores the frequency of occurrence of each bitmask. Initially, the value of  seen = 1.Create a variable cnt, which stores the count of the valid substrings. Initially, the value of cnt = 0.Iterate for each i in the range [0, N) and Bitwise XOR the value of the mask with the integer representing the ith character of the string and increment the value of cnt by seen[mask].For each valid i, Iterate through all characters in the range [a, z] and increase its frequency by flipping the jth set-bit in the current mask and increment the value of the cnt by the frequency of bitmask after flipping the jth set-bit.The value stored in cnt is the required answer.Below is the implementation of the above approach:C++#include using namespace std;  int uniqueSubstrings(string S){        unordered_map seen;          seen = 1;          int mask = 0;              int cnt = 0;      for (int i = 0; i < S.length(); ++i) {                  mask ^= (1