長度爲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); } }