农夫约翰的 公平摄影(寒假每日一题 17)_hash表 头奶牛站在一维长围栏的不同位置。

公平摄影(寒假每日一题 17)_hash表_02 头牛位于位置 公平摄影(寒假每日一题 17)_#define_03,其所属品种为 公平摄影(寒假每日一题 17)_算法_04(根西岛牛或荷斯坦牛)。

所有奶牛的位置各不相同。

约翰想给一段连续区间内的奶牛拍摄一张照片,用来在乡村集市上展览。

但是我们希望他所有品种的奶牛都能在照片中得到公平的展示。

因此,他希望确保无论照片中出现哪些品种的奶牛,每种品种的奶牛在照片中的数量都必须相等。

例如,一张照片中只包含荷斯坦牛是可以的,包含荷斯坦牛和根西岛牛各 公平摄影(寒假每日一题 17)_算法_05 头也没问题,但是包含 公平摄影(寒假每日一题 17)_前缀和_06 头荷斯坦牛和 公平摄影(寒假每日一题 17)_算法_07 头根西岛牛则不可以。

请确定,约翰可以拍下的满足以上条件的照片的最大尺寸。

照片的尺寸是指照片中奶牛最大和最小位置之间的差。

约翰最终可能只拍下一头奶牛,这种情况下,照片尺寸为 公平摄影(寒假每日一题 17)_hash表_08

输入格式
第一行包含整数 公平摄影(寒假每日一题 17)_hash表

接下来 公平摄影(寒假每日一题 17)_hash表 行,每行包含一个整数 公平摄影(寒假每日一题 17)_#define_03 和一个字符 公平摄影(寒假每日一题 17)_算法_04公平摄影(寒假每日一题 17)_#define_13 表示荷斯坦牛,公平摄影(寒假每日一题 17)_#define_14 表示根西岛牛)。

输出格式
输出照片的最大尺寸。

数据范围
公平摄影(寒假每日一题 17)_#define_15

输入样例:

6
4 G
10 H
7 G
16 G
1 G
3 H

输出样例:

7

样例解释
公平摄影(寒假每日一题 17)_#include_16 头牛,从左到右排列顺序为 公平摄影(寒假每日一题 17)_hash表_17

最佳摄影方案是拍中间四头奶牛,恰好荷斯坦牛和根西岛牛各两头。


​前缀和 + hash表 + 双指针(枚举)​

#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 100010;

int n;
PII q[N];

int main(){

scanf("%d", &n);
for(int i = 1; i <= n; i++){

int x;
char str[2];
scanf("%d%s", &x, str);
if(*str == 'G') q[i] = {x, 1};
else q[i] = {x, -1};
}

sort(q + 1, q + n + 1);

unordered_map<int, int> hash;

int res = 0, sum = 0, last;
for(int i = 1; i <= n; i++){

if(!hash.count(sum)) hash[sum] = q[i].x;
sum += q[i].y;
if(hash.count(sum)) res = max(res, q[i].x - hash[sum]); // 当前前缀和与之前出现过的前缀和相等

if(i == 1 || q[i].y != q[i - 1].y) last = q[i].x;
res = max(res, q[i].x - last);
}

printf("%d\n", res);

return 0;
}