AtCoder - 4496 G - k-DMC

AtCoder - 4496 G - k-DMC

題目

長度爲n的字符串,q次查詢,問「DMC」(不要求連續)在字符串中出現的次數,其中D和M的距離不超過k。ios

錯誤思路

經過遍歷字符串中的每個「M」,再移動窗口,處理左右「D」、「C」的數量。(TLE)spa

題解

  • 滑動窗口,維護當前窗口中"D"、「M」、「DM」的數量,遇「C」則ans加上"DM"的數量。code

    代碼

#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);
    }
}
相關文章
相關標籤/搜索