题解:CF1660F2 Promising String (hard version)
xiaozekai11 · · 题解
题意简述
定义一次“操作”为将两个
思路
设
那么,问题就转化为了求有多少个子串,
实现
将
参考代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll T,n,d[210000],D=200001;
struct tree{
ll c[410000];
ll lowbit(ll x){return x&-x;}
void add(ll i,ll x){
for(;i<=D+n;i+=lowbit(i))c[i]+=x;
}
ll sum(ll i){
ll ans=0;
for(;i;i-=lowbit(i))ans+=c[i];
return ans;
}
}c[3];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n;
d[0]=D;
ll ans=0;
c[0].add(D,1);
for(int i=1;i<=n;i++){
char ch;
cin>>ch;
if(ch=='+')d[i]=d[i-1]-1;
else d[i]=d[i-1]+1;
ll x=d[i]%3;
ans+=c[x].sum(d[i]);
c[x].add(d[i],1);
}
for(int i=-n;i<=n;i++)c[0].c[i+D]=c[1].c[i+D]=c[2].c[i+D]=0;
cout<<ans<<'\n';
}
return 0;
}