Untitled
unknown
c_cpp
4 years ago
1.8 kB
4
Indexable
//seg tree without lazy propagation #include<bits/stdc++.h> using namespace std; #define FOR(i, x, y) for (int i = (x); i <= (y); i++) #define forr(i, x, y) for (int i = (x); i < (y); i++) #define forrl(i, x, y) for (ll i = (x); i < (y); i++) #define dow(i, x, y) for (int i = (x); i >= (y); i--) #define mp make_pair #define F first #define S second #define pb push_back #define siz(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() #define fil(a, b) memset((a), (b), sizeof(a)) typedef long long ll; typedef unsigned long long ull; const int MOD=1e9+7; const double pi=acos(-1); const int MAX=2*1e5+5; const int N=1e6+5; struct ff{ int a; int b; int c; int least_b; int least_c; }; string s; ll ans; ff seg_Tree[4*N]; ll n,x,y; bool found; ff merg(ff l,ff r){ return {l.a+r.a,l.b+r.b,l.c+r.c,}; } void build(int id=0,int ns=0,int ne=n-1){ if(found ){ return; } if(ns==ne){ seg_Tree[id]={s[ns]=='a',s[ns]=='b',s[ns]=='c'}; return; } int left=2*id+1;//left id of seg tree int right=left+1;//right id int mid= (ns+ne)/2;//mid range build(left,ns,mid); build(right,mid+1,ne); seg_Tree[id]=merg(seg_Tree[left],seg_Tree[right]); if(!found&&ne-ns+1>=2&& seg_Tree[id].a>seg_Tree[id].b&& seg_Tree[id].a>seg_Tree[id].c){ found=true; ans=ne-ns+1; } } void solve(){ cin>>n>>s; found =false; build(); if(found){ cout<<ans<<endl; }else{ cout<<-1<<endl; } } int main(){ // #ifndef ONLINE_JUDGE // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); // #endif ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); ll t=1; //init(); cin>>t; for (ll i = 1; i <= t; i++) { // cout<<"Case "<<i<<": "; solve(); } return 0; }
Editor is loading...