This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#define tof_io ios_base::sync_with_stdio(false);cin.tie(0) , cout.tie(0);
#define double long double
#define int long long
#define pb push_back
#define all(x) x.begin(),x.end()
#define endl '\n'
const int mod = 998244353; //998244353 1e9+7 1e9+9
const int inf = 1e18;
const int N = 1e6 + 23;
const int lg = 23;
int fac[N];
int inv[N];
int dnt_pow (int a, int b, int md = mod){int ans = 1; while(b){if(b&1){ans = (a*ans)%md;}a = (a*a)%md;b >>= 1;}return ans ;}
void dnt_bld (){fac[0] = 1; inv[0] = dnt_pow(fac[0],mod-2) ;for(int i = 1 ; i < N ; i++) {fac[i] = (fac[i-1] * i) % mod;inv[i] = dnt_pow( fac[i] , mod-2);}}
int dnt_ncr (int r,int n){if(r>n) return 0; return fac[n] * inv[r] % mod * inv[n-r] % mod;}
bool cmp (pair<int,int> a, pair<int,int> b){ return a.second > b.second; }
char x[6] = {'a','b','c','d','e'};
vector<int> v ;
int vis[10];
double ans = 1e18;
int L,R;
int freq[N][6],n;
double mn = 1.0;
vector<int> cnt(26);
void check(string s , int i , int j)
{
double len = j - i + 1;
double cnt1 = 0;
for(int i = 0; i < 26; i++)
{
if(cnt[i] > 0) cnt1++;
}
double res = cnt1 / len;
if(res < mn)
{
L = i;
R = j;
mn = res;
}
}
bool ok(int mid,int l)
{
if(l + mid - 1 >= n)
return 0;
for(int i = 0; i < 5; i++)
{
int x;
if(l == 0)
x = freq[l+mid-1][i];
else
x = freq[l+mid-1][i] - freq[l-1][i];
if(vis[i]==0 and x!=0)
return 0;
}
return 1;
}
void bt(int index)
{
if(index == 5)
{
for(int i = 0 ; i < n ;i++)
{
int l=0;
int r=n;
while(l < r)
{
int mid = ( l + r + 1 ) / 2;
if(ok(mid,i) == 1)
{
l = mid;
}
else
{
r=mid-1;
}
}
double cnt1 = 0;
for(int i = 0 ; i < 5 ; i++)
if(vis[i])
cnt1++;
double len=l;
double res = cnt1 / len;
if(cnt1/l < ans)
{
L = i;
R = i + len - 1;
ans = res;
}
}
return ;
}
vis[x[index]-'a'] = 1;
bt(index + 1);
vis[x[index]-'a'] = 0;
bt(index + 1);
}
void solve1(int n, string s)
{
for(int j = 0; j < 5; j++)
{
freq[0][j]=(j==(s[0]-'a'));
}
for(int i = 1; i < n; i++)
{
for(int j = 0; j < 5; j++)
{
freq[i][j] = freq[i-1][j] +( j == (s[i]-'a'));
}
}
bt(0);
cout << L + 1 <<' ' << R + 1 ;
}
void solve2(int n, string s)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < 26; j++) cnt[j] = 0;
string k="";
for(int j = i; j < n; j++)
{
k = k + s[j];
cnt[s[j]-'a']++;
check(k,i,j);
}
}
cout << L+1 << ' ' << R+1;
}
int32_t main()
{
cin >> n;
string s;
cin >> s;
int wich = 0;
for(int i = 0; i < n; i++)
{
if(s[i] == 'a' or s[i] == 'b' or s[i] == 'c' or s[i] == 'd' or s[i] == 'e') wich++;
}
if(wich == n)
{
solve1(n,s);
}
else
{
solve2(n,s);
}
}
Compilation message (stderr)
nivelle.cpp: In function 'bool ok(long long int, long long int)':
nivelle.cpp:51:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
51 | if(l + mid - 1 >= n)
| ^~
nivelle.cpp:54:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
54 | for(int i = 0; i < 5; i++)
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |