大体上的思路不算太难,但是细节巨多无比.
注意我们必须要选一个,所以在记录极差的同时还要记录一下上一次出现的位置.
code:
#include <cstdio>
#include <algorithm>
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
const int N=1e6+7,M=27;
int n,ans;
int last[M],num[N],p[M][M],minv[M][M];
char str[N];
int main()
{
// setIO("input");
int i,j;
scanf("%d%s",&n,str+1);
for(i=1;i<=n;++i)
{
int c=str[i]-'a';
++num[c],last[c]=i;
for(j=0;j<26;++j)
{
if(j!=c&&num[j])
{
ans=max(ans,max(num[c]-num[j]-minv[c][j]-(last[j]==p[c][j]),num[j]-num[c]-minv[j][c]-(last[c]==p[j][c])));
}
}
for(j=0;j<26;++j)
{
if(num[j]-num[c]<minv[j][c])
{
minv[j][c]=num[j]-num[c];
p[j][c]=i;
}
}
}
printf("%d\n",ans);
return 0;
}