AtCoder - 4496 G - k-DMC

AtCoder - 4496 G - k-DMC

题目

长度为n的字符串,q次查询,问“DMC”(不要求连续)在字符串中出现的次数,其中D和M的距离不超过k。

错误思路

通过遍历字符串中的每一个“M”,再移动窗口,处理左右“D”、“C”的数量。(TLE)

题解

  • 滑动窗口,维护当前窗口中"D"、“M”、“DM”的数量,遇“C”则ans加上"DM"的数量。

    代码

#include <cstdio>
#include <iostream>
#include <vector>
#include <set>
#include <ctime>
#include <cstdlib>
using namespace std;
typedef long long ll;
int main(){
    int n,q;
    string s;
    cin>>n>>s>>q;
    while (q--) {
        int k;cin>>k;
        ll d=0,m=0,dm=0,dmc=0,i;
        for(i=0;i<k;i++){
            switch (s[i]) {
                case 'D':
                    d++;
                    break;
                    
                case 'M':
                    dm+=d;
                    m++;
                    break;
                    
                case 'C':
                    dmc+=dm;
            }
        }
        for(;i<n;i++){
            switch (s[i-k]) {
                case 'D':
                    d--;
                    dm-=m;
                    break;
                    
                case 'M':
                    m--;
            }
            switch (s[i]) {
                case 'D':
                    d++;
                    break;
                    
                case 'M':
                    dm+=d;
                    m++;
                    break;
                    
                case 'C':
                    dmc+=dm;
            }
        }
        printf("%lld\n",dmc);
    }
}

猜你喜欢

转载自www.cnblogs.com/Waldeinsamkeit/p/11929588.html