| 比赛 |
26暑假集训模拟赛2 |
评测结果 |
AAAAAAATATT |
| 题目名称 |
It s Mooin Time III |
最终得分 |
72 |
| 用户昵称 |
赵飞羽 |
运行时间 |
5.146 s |
| 代码语言 |
C++ |
内存使用 |
33.36 MiB |
| 提交时间 |
2026-07-02 09:48:09 |
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100010, C = 30;
int n, q, pos[C], lst[C][N], idx[C], fst[C][N], tot[C], f[C][N], ans;
char s[N];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
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 <= n; i++) f[s[i]-'a'+1][++tot[s[i]-'a'+1]] = i;
for (int i = 1; i <= n; i++) {
pos[s[i]-'a'+1] = i;
for (int j = 1; j <= 26; j++) lst[j][i] = pos[j];
}
for (int i = n; i >= 1; i--) {
idx[s[i]-'a'+1] = i;
for (int j = 1; j <= 26; j++) fst[j][i] = idx[j];
}
while (q--) {
int l, r;
cin >> l >> r;
ans = 0;
for (int i = 1; i <= 26; i++) {
int x = fst[i][l];
if (x < l || x > r) continue;
for (int k = 1; k <= 26; k++) {
if (i == k) continue;
int y = lst[k][r];
if (y < l || y > r || y <= x + 1) continue;
int ql = 1, qr = tot[k], mid, m = (x + y) / 2;
while (ql < qr) {
mid = (ql + qr) / 2;
if (f[k][mid] > r) qr = mid - 1;
else if (f[k][mid] < l) ql = mid + 1;
else {
if (f[k][mid] <= m) ql = mid;
if (f[k][mid] > m) qr = mid;
}
if (ql + 1 == qr) break;
}
int al = (y - f[k][ql]) * (f[k][ql] - x);
int ar = (y - f[k][qr]) * (f[k][qr] - x);
int cnt = max(al, ar);
ans = max(ans, cnt);
}
}
cout << (ans? ans: -1) << "\n";
}
return 0;
}