题目链接: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;
}