题解:CF2145C Monocarp's String
reinforest · · 题解
考虑赋权,把所有的 a 设成 b 设成
考虑把每一个点的后缀和算出来,然后开 vector 或者 set 之类的维护。
然后从前往后枚举
然后把所有的
:::success[通过代码]
#include<bits/stdc++.h>
#define ll long long
using namespace std;
constexpr ll maxn=2e5+5;
ll T,n,arr[maxn];
char ch[maxn];
set<ll> id[maxn<<2];
void solve(){
cin>>n>>(ch+1);
for(int i=1;i<=n;i++){
if(ch[i]=='a')arr[i]=1;
if(ch[i]=='b')arr[i]=-1;
}
for(int i=-n;i<=n;i++){
id[i+maxn].clear();
}
ll suf=0,ans=n,pre=0;
id[0+maxn].insert(n+1);
for(int i=n;i>=1;i--){
suf+=arr[i];
id[suf+maxn].insert(i);
}
if(suf==0){
cout<<0<<"\n";
return;
}
for(int i=0;i<=n;i++){
pre+=arr[i];
auto nxt=id[-pre+maxn].upper_bound(i);
if(nxt==id[-pre+maxn].end())continue;
ll pp=*nxt;
ans=min(ans,pp-i-1);
}
if(ans==n){
cout<<-1<<"\n";
return;
}
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--){
solve();
}
return 0;
}
:::