| 比赛 |
26暑假集训模拟赛2 |
评测结果 |
AAAAAAAAAAA |
| 题目名称 |
It s Mooin Time III |
最终得分 |
100 |
| 用户昵称 |
rzzakioi |
运行时间 |
2.711 s |
| 代码语言 |
C++ |
内存使用 |
4.80 MiB |
| 提交时间 |
2026-07-02 10:01:27 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
int n,q,l[405],r[405],id[100005];
string s;
int nwd[405][30],nans[30];
vector<int>v[30];
signed main(){
freopen("Time.in","r",stdin);
freopen("Time.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>q;
cin>>s;
s=' '+s;
int len=sqrt(n);
int num=(n+len-1)/len;
for(int i=1;i<=num;i++){
l[i]=(i-1)*len+1;
r[i]=min(i*len,n);
}
for(int i=1;i<=n;i++){
id[i]=(i-1)/len+1;
}
memset(nwd,0x3f,sizeof(nwd));
for(int i=1;i<=num;i++){
for(int j=l[i];j<=r[i];j++){
for(char c='a';c<='z';c++){
if(c==s[j])continue;
nwd[i][c-'a']=min(nwd[i][c-'a'],j);
}
v[s[j]-'a'].push_back(j);
}
}
while(q--){
int lt,rt;
cin>>lt>>rt;
memset(nans,0x3f,sizeof(nans));
if(id[lt]==id[rt]){
for(int i=lt;i<=rt;i++){
for(char c='a';c<='z';c++){
if(c==s[i])continue;
nans[c-'a']=min(nans[c-'a'],i);
}
}
}
else{
for(int i=id[lt]+1;i<=id[rt]-1;i++){
for(char c='a';c<='z';c++){
nans[c-'a']=min(nans[c-'a'],nwd[i][c-'a']);
}
}
for(int i=lt;i<=r[id[lt]];i++){
for(char c='a';c<='z';c++){
if(c==s[i])continue;
nans[c-'a']=min(nans[c-'a'],i);
}
}
for(int i=l[id[rt]];i<=rt;i++){
for(char c='a';c<='z';c++){
if(c==s[i])continue;
nans[c-'a']=min(nans[c-'a'],i);
}
}
}
int ans=-1;
for(int c='a'-'a';c<='z'-'a';c++){
// cout<<(char)(c+'a')<<' '<<nans[c]<<'\n';
if(v[c].size()<3)continue;
if(nans[c]>rt)continue;
int L=0,R=v[c].size()-1,ansl=-1;
while(L<=R){
int mid=(L+R)>>1;
if(v[c][mid]>nans[c]){
R=mid-1;
ansl=mid;
}
else L=mid+1;
}
if(ansl==-1)continue;
L=0,R=v[c].size()-1;
// cout<<L<<' '<<R<<'\n';
int ansr=-1;
while(L<=R){
int mid=(L+R)>>1;
if(v[c][mid]<=rt){
ansr=mid;
L=mid+1;
}
else R=mid-1;
}
if(ansr==-1||ansr<=ansl)continue;
// cout<<(char)(c+'a')<<' '<<ansl<<' '<<ansr<<'\n';
L=ansl,R=ansr;
double res=(nans[c]+v[c][ansr])/2.0;
int id1=-1,id2=-1;
while(L<=R){
int mid=(L+R)>>1;
if(v[c][mid]<=res){
id1=mid;
L=mid+1;
}
else{
id2=mid;
R=mid-1;
}
}
// cout<<(char)(c+'a')<<' '<<res<<' '<<id1<<' '<<id2<<'\n';
if(id1!=-1)ans=max(ans,(v[c][id1]-nans[c])*(v[c][ansr]-v[c][id1]));
if(id2!=-1)ans=max(ans,(v[c][id2]-nans[c])*(v[c][ansr]-v[c][id2]));
}
cout<<ans<<'\n';
}
return 0;
}