比赛 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;
}