1. 题目描述

1.1. Limit

Time Limit: 1000 ms

Memory Limit: 524288 kB

1.2. Problem Description

蜗牛在制定今天的旅游计划,有 n n n 个景点可选,它已经把这些景点按照顺路游览的顺序排成一排了,每个地方有相应的景观,这里用一个整数表示。

蜗牛希望选取连续的一段景点,还要选出来的每一个景点的景观都不同,问它最多能选出多少个景点进行旅游。


1.3. Input

第一行,一个正整数 n n n ( 1 n 1 0 5 ) (1 \le n \le 10^5) (1n105)

第二行,包含 n n n 个正整数 a i ( 1 a i 1 0 6 ) a_i(1 \le a_i \le 10^6) ai(1ai106),第 i i i 个整数表示第 i i i 个景点的景观。


1.4. Output

输出一行,包含一个整数,表示蜗牛最多能选出的景点数。


1.5. Sample Input

5
1 2 3 2 1

1.6. Sample Output

3

1.7. Source

计蒜客 39857 蜗牛旅游


2. 解读

STL基本使用。

使用 queue 对每个元素都不同的序列进行存储。依次遍历每个元素,若元素 a i a_i ai 与队列中的所有元素都不相等,则 a i a_i ai 入队。

若队列中存在与 a i a_i ai 相等的元素,队首出队,直到队列中没有与 a i a_i ai 相等的元素, a i a_i ai 入队。

在每次入队操作完全以后,计算队列的长度,在最后输出队列长度的最大值。

3. 代码

#include <iostream>
#include <queue>
#include <string.h>
using namespace std;

const int NUM = 1e6 + 1;

// 队列存储最长不同序列
queue<long long> qu;

// 存储值
long long list[NUM];
// 标志值是否在队列中
bool markList[NUM];

int main()
{
    // test case
    long long t;
    scanf("%lld", &t);
    // 初始化
    memset(list, 0, sizeof(list));
    memset(markList, 0, sizeof(markList));
    // 输入buffer
    long long buffer;
    // 最大值
    size_t max = 0;
    // 输入
    for (int i = 0; i < t; i++) {
        scanf("%lld", &buffer);
        list[i] = buffer;
    }
    // 判断
    for (int i = 0; i < t; i++) {
        // 判断是否在队列中
        if (markList[list[i]] == 0) {
            // 若不在,加入队列
            qu.push(list[i]);
            // 标记数字
            markList[list[i]] = 1;
        } else {
            // 若在,将队首元素出队直到没有元素和即将新入队的元素重复
            while (markList[list[i]] != 0) {
                markList[qu.front()] = 0;
                qu.pop();
            }
            // 加入队列
            qu.push(list[i]);
            // 标记数字
            markList[list[i]] = 1;
        }
        // 存储最长队列
        if (qu.size() > max) {
            max = qu.size();
        }
    }

    // 输出
    printf("%lld\n", max);
}

联系邮箱:curren_wong@163.com

Github:https://github.com/CurrenWong

欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。