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