Pearls in a Row CodeForces 620C 水题

题目:http://codeforces.com/problemset/problem/620/C

文章末有一些测试数据仅供参考

题目大意

给你一个数字串,然后将分成几个部分,要求每个部分中必须有一对儿相等的数字,每个数字都属于某个部分,输出划分的部分数量以及对应区间。

 思路

很简单一道题,输入的数据都不用存的,输入一个检测一个就好了,用map打标记,用容器存一下要输出的区间端点值,最后挨个儿输出就好了

代码如下:

#include<iostream>
#include<map>
#include<vector>
#include<cstdio>
using namespace std;
long long item;
vector<int> V;
int main()
{
    int N;
    map<long long, bool> P;
    while (cin >> N)
    {
        P.clear(), V.clear();
        V.push_back(1);
        for (int i = 1; i <= N; ++i)
        {
            scanf("%I64d", &item);
            if (P[item])
            {
                V.push_back(i);
                if (i != N)                     //如果是最后一个的话就不用放后面的了
                    V.push_back(i + 1);
                P.clear();
            }
            else P[item] = 1;
        }
        int size_ = V.size() / 2 * 2;            //可能会出现奇数(有前无后)
        if (!size_)                              //5:1 2 3 4 5 这种输出为-1情况
        {
            cout << -1 << endl; 
            continue;
        }
        if (V[size_- 1] != N)
            V[size_-1] = N;
        cout << V.size() / 2 << endl;
        for (int i = 0; i < size_; i += 2)
            cout << V[i] << " " << V[i + 1] << endl;
    }
}

测试数据:

Input:

10
1 2 1 3 8 3 77777777 63824 11111112 5
8
11111111 222222222 88888888 11111111 55555555 22222242 15254145 22222242

Output:

2
1 3
4 10
2
1 4
5 8

感谢您的阅读,祝您生活愉快~

原文地址:https://www.cnblogs.com/lv-anchoret/p/8367424.html