Problem:
Score : 600 points

Problem Statement

In Dwango Co., Ltd., there is a content distribution system named 'Dwango Media Cluster', and it is called 'DMC' for short.

The name 'DMC' sounds cool for Niwango-kun, so he starts to define DMC-ness of a string.

Given a string S of length N and an integer k (k \geq 3),
he defines the k-DMC number of S as the number of triples (a, b, c) of integers that satisfy the following conditions:

0 \leq a < b < c \leq N - 1

S[a] = D

S[b] = M

S[c] = C

c-a < k

Here S[a] is the a-th character of the string S. Indexing is zero-based, that is, 0 \leq a \leq N - 1 holds.

For a string S and Q integers k_0, k_1, ..., k_{Q-1}, calculate the k_i-DMC number of S for each i (0 \leq i \leq Q-1).

Constraints

3 \leq N \leq 10^6

S consists of uppercase English letters

1 \leq Q \leq 75

3 \leq k_i \leq N

All numbers given in input are integers

Input

Input is given from Standard Input in the following format:

N
S
Q
k_{0} k_{1} ... k_{Q-1}

Output

Print Q lines.
The i-th line should contain the k_i-DMC number of the string S.

Sample Input 1

18
DWANGOMEDIACLUSTER
1
18

Sample Output 1

1

(a,b,c) = (0, 6, 11) satisfies the conditions.

Strangely, Dwango Media Cluster does not have so much DMC-ness by his definition.

Sample Input 2

18
DDDDDDMMMMMCCCCCCC
1
18

Sample Output 2

210

The number of triples can be calculated as 6\times 5\times 7.

Sample Input 3

54
DIALUPWIDEAREANETWORKGAMINGOPERATIONCORPORATIONLIMITED
3
20 30 40

Sample Output 3

0
1
2

(a, b, c) = (0, 23, 36), (8, 23, 36) satisfy the conditions except the last one, namely, c-a < k_i.

By the way, DWANGO is an acronym for "Dial-up Wide Area Network Gaming Operation".

Sample Output 4

30
DMCDMCDMCDMCDMCDMCDMCDMCDMCDMC
4
5 10 15 20

Sample Output 4

10
52
110
140

Solution in Rust (1.15.1) (judge verdict: Accepted)

fn main() {
    let s = std::io::stdin();
    let mut sc = Scanner { stdin: s.lock() };
    let n: usize = sc.read();
    let s = sc.chars();

    let mut d_sum = vec![0; n + 1];
    let mut m_sum = vec![0; n + 1];
    let mut c_sum = vec![0; n + 1];
    for i in 0..n {
        d_sum[i + 1] = d_sum[i] + if s[i] == 'D' { 1 } else { 0 };
        m_sum[i + 1] = m_sum[i] + if s[i] == 'M' { 1 } else { 0 };
        c_sum[i + 1] = c_sum[i] + if s[i] == 'C' { 1 } else { 0 };
    }

    let q: usize = sc.read();
    for _ in 0..q {
        let k: usize = sc.read();
        let mut d_table: Vec<i64> = vec![0; n + 1];
        let mut d_remove: Vec<i64> = vec![0; n + 1];
        for i in 0..n {
            if s[i] == 'D' {
                d_table[i] += 1;
                if i + k <= n {
                    d_table[i + k] -= 1;
                    d_remove[i + k] += 1;
                }
            }
        }
        let mut d_acc = vec![0; n + 1];
        for i in 0..n {
            d_acc[i] = d_table[i];
            if i > 0 {
                d_acc[i] += d_acc[i - 1];
            }
        }
        let mut m_table = vec![0; n + 1];
        for i in 1..n {
            m_table[i] = m_table[i - 1];
            if s[i] == 'M' {
                m_table[i] += d_acc[i - 1];
            }
            let range_sum = m_sum[i + 1] - if i + 1 >= k { m_sum[i + 1 - k] } else { 0 };
            m_table[i] -= d_remove[i] * range_sum;
        }

        let mut ans = 0;

        //        eprintln!("k={}", k);
        //        format(&s);
        //        format(&m_table);
        //        format(&d_table);

        for i in 1..n {
            if s[i] == 'C' {
                //                let mut naive_sum = 0;
                //                let t = if i < (k - 1) { 0 } else { i - (k - 1) };
                //                for a in t..i {
                //                    for b in (a + 1)..i {
                //                        let c = i;
                //                        if a < b && b < c && c - a < k && s[a] == 'D' && s[b] == 'M' && s[c] == 'C'
                //                        {
                //                            naive_sum += 1;
                //                        }
                //                    }
                //                }
                //                assert_eq!(naive_sum, m_table[i], "i={}", i);

                ans += m_table[i];
            }
        }

        println!("{}", ans);
    }
}

fn format<T: std::fmt::Display>(x: &[T]) {
    for t in x.iter() {
        print!("{}\t", t);
    }
    println!();
}
/*
7
DMCDMCD
1
4
*/
pub struct Scanner<R> {
    stdin: R,
}

impl<R: std::io::Read> Scanner<R> {
    pub fn read<T: std::str::FromStr>(&mut self) -> T {
        use std::io::Read;
        let buf = self
            .stdin
            .by_ref()
            .bytes()
            .map(|b| b.unwrap())
            .skip_while(|&b| b == b' ' || b == b'\n')
            .take_while(|&b| b != b' ' && b != b'\n')
            .collect::<Vec<_>>();
        unsafe { std::str::from_utf8_unchecked(&buf) }
            .parse()
            .ok()
            .expect("Parse error.")
    }
    pub fn vec<T: std::str::FromStr>(&mut self, n: usize) -> Vec<T> {
        (0..n).map(|_| self.read()).collect()
    }
    pub fn chars(&mut self) -> Vec<char> {
        self.read::<String>().chars().collect()
    }
}