比赛 26暑假集训模拟赛2 评测结果 AWAAAWTTTTT
题目名称 It s Mooin Time III 最终得分 36
用户昵称 董彰奇 运行时间 5.668 s
代码语言 C++ 内存使用 4.14 MiB
提交时间 2026-07-02 10:29:05
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n, q, x[100010], jl[27], cnt[27];
map<char, bool>mp;
string s;
int  efl(int l, int r, int L, int R)
{
    int ans = -1;
    while(l <= r)
    {
        int mid = (l + r) / 2;
        if(x[mid] > R)
        {
            r = mid - 1;
        }
        if(x[mid] >= L && x[mid] <= R)
        {
            ans = x[mid];
            r = mid - 1;
        }
        if(x[mid] < L)
        {
            l = mid + 1;
        }
    }
    return ans;
}
int  efr(int l, int r, int L, int R)
{
    int ans = -1;
    while(l <= r)
    {
        int mid = (l + r) / 2;
        if(x[mid] > R)
        {
            r = mid - 1;
        }
        if(x[mid] >= L && x[mid] <= R)
        {
            ans = x[mid];
            l = mid + 1;
        }
        if(x[mid] < L)
        {
            l = mid + 1;
        }
    }
    return ans;
}
int main()
{
    freopen("Time.in", "r", stdin);
    freopen("Time.out", "w", stdout);
    scanf("%d%d", &n, &q);
    cin >> s;
    for(int i = 0; i < s.size(); i++)
    {
        mp[s[i]] = 1;
        jl[s[i] - 'a' + 1]++;
    }
    for(int i = 0; i <= 25; i++)jl[i] = jl[i - 1] + jl[i];
    for(int i = 0; i <= 25; i++)cnt[i] = jl[i];
    for(int i = 0; i < s.size(); i++)
    {
        jl[s[i] - 'a'] ++;
        x[jl[s[i] - 'a']] = i + 1;

    }
    for(int i = 1; i <= q; i++)
    {
        int l, r;
        scanf("%d%d", &l, &r);
        int cnt1 = -1;
        for(int j = 0; j <= 25; j++)
        {
            if(!mp[j + 'a'])continue;
            int ls = efl(cnt[j] + 1, cnt[j + 1], l, r);
            if(ls == -1)continue;
            for(int k = 0; k <= 25; k++)
            {
                if(k == j)continue;
                if(!mp[k + 'a'])continue;
                int rs = efr(cnt[k] + 1, cnt[k + 1], l, r);
                if(rs == -1)continue;
                for(int o = ls + 1; o < rs; o++)
                {
                    if(s[o - 1] == k + 'a')
                    {
                        cnt1 = max(cnt1, (o - ls) * (rs - o));
                    }
                }
            }
        }
        printf("%d\n", cnt1);
    }
    return 0;
}