显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
char s[100010];
long long n,q,l,r,tl,tr,ti,tk,tj;
int v1[28][100010];
int v2[28][100010];
int main()
{
freopen("Time.in","r",stdin);
freopen("Time.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
for(int i=1;i<=26;i++)
{
int tmp=-1;
for(int j=1;j<=n;j++)
{
if(s[j]==char(i-1+'a'))
{
tmp=j;
}
v1[i][j]=tmp;
}
tmp=-1;
for(int j=n;j>=1;j--)
{
if(s[j]==char(i-1+'a'))
{
tmp=j;
}
v2[i][j]=tmp;
}
}
while(q--)
{
cin>>l>>r;
long long ans=-1;
for(int i=1;i<=26;i++)
{
tk=v1[i][r];
ti=100000000;
for(int j=1;j<=26;j++)
{
if(i!=j)
{
if(v2[j][l]!=-1)
ti=min(ti,(long long)v2[j][l]);
}
}
if(ti==-1)
{
continue;
}
tr=v1[i][tk-1];
tl=v2[i][ti];
if(tr<1||tl<1)
continue;
tj=-1;
long long m1=-10,m2=-10;
while(tr-tl>2)
{
if(m1==v1[i][tl+(tr-tl)/3]&&m2==v2[i][tr-(tr-tl)/3])
break;
m1=v1[i][tl+(tr-tl)/3];
m2=v2[i][tr-(tr-tl)/3];
if((m1-ti)*(tk-m1)>(m2-ti)*(tk-m2))
tr=m2;
else
tl=m1;
}
for(int j=tl;j<=tr;j=v2[i][j+1])
{
tj=max((v1[i][j]-ti)*(tk-v1[i][j]),tj);
}
ans=max(ans,tj);
}
cout<<ans<<endl;
}
return 0;
}