题目链接:https://ac.nowcoder.com/acm/contest/372/D
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
可能很多人要吐槽为什么标题不是“救救blabla”了。
怪人PM6喜欢数糖纸,不同的糖纸有不同的颜色,一共有 N 张糖纸,第 i 张糖纸颜色为 Ci ,它们的位置都是固定的。PM6喜欢五彩缤纷的糖纸,所以他不希望有重复的颜色。他有一次机会,可以收集任意一段连续区间内的糖纸。求出PM6最多能收集多少张糖纸。
输入描述
第一行一个正整数 N ,表示共有 N 张糖纸。
第二行共有 N 个正整数,第 i 个正整数表示第 i 张糖纸的颜色 Ci
对于20%的数据:1<=N<=100
对于40%的数据:1<=N<=1000
对于100%的数据:1<=N<=1e6,0<=Ci<=1e9
输出描述
一个整数表示PM6最多能收集多少张糖纸。
输入
5
1 2 2 3 4
输出
3
说明
PM6可以收集第3到第5张的糖纸,共有三张。
解题思路
直接从第一个开始模拟就行了,如果遇到没有出现的就标记,否则就清除以前标记的,直到此颜色的标记消失,然后再从该位置开始模拟。
#include <bits/stdc++.h>
using namespace std;
int s[1000005];
int n, l, r, max_;
bool vis[1000000005];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &s[i]);
max_ = l = r = 0;
while (r < n) {
if (!vis[s[r]])
max_ = max(max_, r - l + 1);
while (vis[s[r]])
vis[s[l++]] = 0;
vis[s[r++]] = 1;
}
printf("%d\n", max_);
return 0;
}