Given a string **str** and an array of special characters, **specialArray[]**, the task is to find the sum of the ratio of the count of special characters to the length of the substring for all possible substring of the given string.

Ratio of count of special characters in a substring to the length of subtrings of the given string is given by

Sum of the ratios calculated above is given by

**Examples:**

Input:str = “abcdabc”, specialArray[] = {‘a’, ‘b’, ‘c’, ‘d’}

Output:28.00000

Explanation:

Length of string = 7

Count of all possible substrings = (7 * (8 + 1)) / 2 = 28

Since, all the characters of the string are included in sprecialArray[], ratio of count of special characters to the length of substring for every substring will always be 1.

Hence, the sum of ratio = Number of substrings * 1 = 28.

Input:str = “abcd”, specialArray[] = {‘b’, ‘c’}

Output:5.83333

**Approach:**

Follow the steps below to solve the problem:

- For every possible length of substrings from 1 to N, find the count of special characters in every substring of length x and add the ratio of count and x to the answer.
- To find the count of special characters in each substring in constant time, create a prefix sum array of the count of special characters using the relation:

**prefix[i] = prefix[i – 1] + special(s[i]);** - Calculate the count of special characters in a substring within the indices
**[i, j]**is given by the relation:

prefix[j – 1] – prefix[i – 1]

Therefore, the ratio of the count of special characters to the length of substring,

f(i, j) = (prefix[j – 1] – prefix[i – 1])/(j – i + 1)

Below is the implementation of the above approach:

## C++

`// C++ Program to impleemnt ` `// the above approach ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `const` `int` `N = 1e5 + 5; ` ` ` `// Stores frequency of special ` `// characters in the array ` `vector<` `int` `> prefix(N, 0); ` ` ` `// Stores prefix sum ` `vector<` `int` `> sum(N, 0); ` ` ` `// Function to check whether a character ` `// is special or not ` `bool` `isSpecial(` `char` `c, ` ` ` `vector<` `char` `>& special) ` `{ ` ` ` `for` `(` `auto` `& i : special) ` ` ` ` ` `// If current character ` ` ` `// is special ` ` ` `if` `(i == c) ` ` ` `return` `true` `; ` ` ` ` ` `// Otherwise ` ` ` `return` `false` `; ` `} ` ` ` `// Function to find sum of ratio of ` `// count of special characters and ` `// length of substrings ` `double` `countRatio(string& s, ` ` ` `vector<` `char` `>& special) ` `{ ` ` ` ` ` `int` `n = s.length(); ` ` ` `for` `(` `int` `i = 0; i < n; i++) { ` ` ` ` ` `// Calculate the prefix sum of ` ` ` `// special nodes ` ` ` `prefix[i] = ` `int` `(isSpecial(s[i], ` ` ` `special)); ` ` ` `if` `(i > 0) ` ` ` `prefix[i] += prefix[i - 1]; ` ` ` `} ` ` ` ` ` `for` `(` `int` `i = 0; i < n; i++) { ` ` ` ` ` `// Generate prefix sum array ` ` ` `sum[i] = prefix[i]; ` ` ` `if` `(i > 0) ` ` ` `sum[i] += sum[i - 1]; ` ` ` `} ` ` ` ` ` `double` `ans = 0; ` ` ` `for` `(` `int` `i = 1; i <= n; i++) { ` ` ` ` ` `// Calculate ratio for substring ` ` ` `int` `count = sum[n - 1] ` ` ` `- (i > 1 ? sum[i - 2] : 0); ` ` ` `count ` ` ` `-= (i < n ? sum[n - i - 1] : 0); ` ` ` ` ` `ans += ` `double` `(count) / ` `double` `(i); ` ` ` `} ` ` ` ` ` `return` `ans; ` `} ` ` ` `// Driver Code; ` `int` `main() ` `{ ` ` ` `string s = ` `"abcd"` `; ` ` ` `vector<` `char` `> special = { ` `'b'` `, ` `'c'` `}; ` ` ` ` ` `double` `ans = countRatio(s, special); ` ` ` ` ` `cout << fixed << setprecision(6) ` ` ` `<< ans << endl; ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

## Python3

`# Python3 program to implement ` `# the above approach ` `N ` `=` `100005` ` ` `# Stores frequency of special ` `# characters in the array ` `prefix ` `=` `[` `0` `] ` `*` `N ` ` ` `# Stores prefix sum ` `sum` `=` `[` `0` `] ` `*` `N ` ` ` `# Function to check whether a character ` `# is special or not ` `def` `isSpecial(c, special): ` ` ` ` ` `for` `i ` `in` `special: ` ` ` ` ` `# If current character ` ` ` `# is special ` ` ` `if` `(i ` `=` `=` `c): ` ` ` `return` `True` ` ` ` ` `# Otherwise ` ` ` `return` `False` ` ` `# Function to find sum of ratio of ` `# count of special characters and ` `# length of substrings ` `def` `countRatio(s, special): ` ` ` ` ` `n ` `=` `len` `(s) ` ` ` `for` `i ` `in` `range` `(n): ` ` ` ` ` `# Calculate the prefix sum of ` ` ` `# special nodes ` ` ` `prefix[i] ` `=` `int` `(isSpecial(s[i], ` ` ` `special)) ` ` ` `if` `(i > ` `0` `): ` ` ` `prefix[i] ` `+` `=` `prefix[i ` `-` `1` `] ` ` ` ` ` `for` `i ` `in` `range` `(n): ` ` ` ` ` `# Generate prefix sum array ` ` ` `sum` `[i] ` `=` `prefix[i] ` ` ` `if` `(i > ` `0` `): ` ` ` `sum` `[i] ` `+` `=` `sum` `[i ` `-` `1` `] ` ` ` ` ` `ans ` `=` `0` ` ` `for` `i ` `in` `range` `(` `1` `, n ` `+` `1` `): ` ` ` ` ` `# Calculate ratio for substring ` ` ` `if` `i > ` `1` `: ` ` ` `count ` `=` `sum` `[n ` `-` `1` `]` `-` `sum` `[i ` `-` `2` `] ` ` ` `else` `: ` ` ` `count ` `=` `sum` `[n ` `-` `1` `] ` ` ` `if` `i < n: ` ` ` `count ` `-` `=` `sum` `[n ` `-` `i ` `-` `1` `] ` ` ` ` ` `ans ` `+` `=` `count ` `/` `i ` ` ` ` ` `return` `ans ` ` ` `# Driver Code ` `if` `__name__ ` `=` `=` `"__main__"` `: ` ` ` ` ` `s ` `=` `"abcd"` ` ` `special ` `=` `[ ` `'b'` `, ` `'c'` `] ` ` ` ` ` `ans ` `=` `countRatio(s, special) ` ` ` ` ` `print` `(` `'%.6f'` `%` `ans) ` ` ` `# This code is contributed by chitranayal ` |

*chevron_right*

*filter_none*

**Output:**

5.833333

**Time Complexity: **O(N)

**Space Complexity: **O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- Sum of two numbers if the original ratio and new ratio obtained by adding a given number to each number is given
- Ratio of mth and nth terms of an A. P. with given ratio of sums
- Find the number which when added to the given ratio a : b, the ratio changes to c : d
- Find number of substrings of length k whose sum of ASCII value of characters is divisible by k
- Split a given string into substrings of length K with equal sum of ASCII values
- Program to calculate the profit sharing ratio
- Count of substrings of length K with exactly K distinct characters
- Reverse a string without affecting special characters
- Program to count vowels, consonant, digits and special characters in string.
- Check if a string contains uppercase, lowercase, special characters and numeric values
- Remove minimum characters from string to split it into three substrings under given constraints
- Count of substrings of a given Binary string with all characters same
- Minimum flips required to convert given string into concatenation of equal substrings of length K
- Minimum length of the sub-string whose characters can be used to form a palindrome of length K
- Count the number of Special Strings of a given length N
- Find distinct characters in distinct substrings of a string
- Count number of substrings of a string consisting of same characters
- Check if a string can be split into substrings starting with N followed by N characters
- Total length of string from given Array of strings composed using given characters
- Count of Substrings that can be formed without using the given list of Characters

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.