1913. 公平摄影
农夫约翰的 N 头奶牛站在一维长围栏的不同位置。
第 i 头牛位于位置 xi,其所属品种为 bi(根西岛牛或荷斯坦牛)。
所有奶牛的位置各不相同。
约翰想给一段连续区间内的奶牛拍摄一张照片,用来在乡村集市上展览。
但是我们希望他所有品种的奶牛都能在照片中得到公平的展示。
因此,他希望确保无论照片中出现哪些品种的奶牛,每种品种的奶牛在照片中的数量都必须相等。
例如,一张照片中只包含荷斯坦牛是可以的,包含荷斯坦牛和根西岛牛各 27 头也没问题,但是包含 10 头荷斯坦牛和 9 头根西岛牛则不可以。
请确定,约翰可以拍下的满足以上条件的照片的最大尺寸。
照片的尺寸是指照片中奶牛最大和最小位置之间的差。
约翰最终可能只拍下一头奶牛,这种情况下,照片尺寸为 0。
输入格式
第一行包含整数 N。
接下来 N 行,每行包含一个整数 xi 和一个字符 bi(H 表示荷斯坦牛,G 表示根西岛牛)。
输出格式
输出照片的最大尺寸。
数据范围
1≤N≤105,
0≤xi≤109
输入样例:
6
4 G
10 H
7 G
16 G
1 G
3 H
输出样例:
7
样例解释
共 6 头牛,从左到右排列顺序为 G,H,G,G,H,G。
最佳摄影方案是拍中间四头奶牛,恰好荷斯坦牛和根西岛牛各两头。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;typedef pair<int, int> PII;int n;
PII q[N];int main()
{cin >> n;for (int i = 1; i <= n; i++){char ch[2];int x;scanf("%d%s", &x, ch);if (ch[0] == 'G')q[i] = {x, 1};elseq[i] = {x, -1};}sort(q + 1, q + 1 + n);unordered_map<int, int> hash;int last;int res = 0;int sum = 0;for (int i = 1; i <= n; i++){//相同连续字串长度if (i == 1 || q[i].second != q[i - 1].second)last = q[i].first;res = max(res, q[i].first - last);// 若前缀和相等 则左开右闭区间和为0 让前缀和的值放在下一个下标处 并在本下标处判断是否记录过if (!hash.count(sum))hash[sum] = q[i].first;sum += q[i].second;if (hash.count(sum))res = max(res, q[i].first - hash[sum]);}cout << res << endl;return 0;
}