Codeforces Round #765 (Div. 2)B. Elementary Particles

Martians are actively engaged in interplanetary trade. Olymp City, the Martian city known for its spaceport, has become a place where goods from all the corners of our Galaxy come. To deliver even more freight from faraway planets, Martians need fast spaceships.

A group of scientists conducts experiments to build a fast engine for the new spaceship. In the current experiment, there are n elementary particles, the i-th of them has type ai.

Denote a subsegment of the particle sequence (a1,a2,…,an) as a sequence (al,al+1,…,ar) for some left bound l and right bound r (1≤l≤r≤n). For instance, the sequence (1 4 2 8 5 7) for l=2 and r=4 has the sequence (4 2 8) as a subsegment. Two subsegments are considered different if at least one bound of those subsegments differs.

Note that the subsegments can be equal as sequences but still considered different. For example, consider the sequence (1 1 1 1 1) and two of its subsegments: one with l=1 and r=3 and another with l=2 and r=4. Both subsegments are equal to (1 1 1), but still considered different, as their left and right bounds differ.

The scientists want to conduct a reaction to get two different subsegments of the same length. Denote this length k. The resulting pair of subsegments must be harmonious, i. e. for some i (1≤i≤k) it must be true that the types of particles on the i-th position are the same for these two subsegments. For example, the pair (1 7 3) and (4 7 8) is harmonious, as both subsegments have 7 on the second position. The pair (1 2 3) and (3 1 2) is not harmonious.

The longer are harmonious subsegments, the more chances for the scientists to design a fast engine. So, they asked you to calculate the maximal possible length of harmonious pair made of different subsegments.

Input
The first line contains an integer t (1≤t≤100) — the number of test cases. The following are descriptions of the test cases.

The first line contains an integer n (2≤n≤150000) — the amount of elementary particles in the sequence.

The second line contains n integers ai (1≤ai≤150000) — types of elementary particles.

It is guaranteed that the sum of n over all test cases does not exceed 3⋅105.

Output
For each test, print a single integer, maximal possible length of harmonious pair made of different subsegments. If such pair does not exist, print −1 instead.

Example
inputCopy
4
7
3 1 5 2 1 3 4
6
1 1 1 1 1 1
6
1 4 2 8 5 7
2
15 15
outputCopy
4
5
-1
1
Note
The first test case is shown on the picture below:

As you can see from it, you may choose the subsegments (2 1 3 4) and (3 1 5 2), which are a harmonious pair. Their length is equal to 4, so the answer is 4.

In the second test case, you need to take two subsegments: one with l=1 and r=5, and one with l=2 and r=6. It’s not hard to observe that these segments are a harmonious pair and considered different even though they are both equal to (1 1 1 1 1).

In the third test case, you cannot make a harmonious pair, so the answer is −1.
好久没写cf了,希望之后能够上分
题意:
就是要你找到能够让两个长度相同(但不完全相同的)子串有某个同一位置的数字相同,求那个最大的子串长度

原先的代码:

#include<bits/stdc++.h>
using namespace std;
int a[150005]={0};
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
           scanf("%d",a+i);
        int ans=0;
        int sign=100,sign2=1000;
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
        {if(a[i]!=a[j]){
            sign=99;
        }
        else
            {
                sign2=990;
                **ans=max(ans,i+n-j);**
            }
        }

        if(sign==100){
            printf("%d\n",n-1);
            continue;
        }
        else if(sign2==990&&sign==99)
        {
            printf("%d\n",ans);
            continue;
        }
        else if(sign2==1000)
        {
            printf("-1\n");
            continue;
        }

    }
    return 0;
}

题补:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    map<int,int>mp;
    scanf("%d",&t);
    while(t--)
    {
        mp.clear();
        int n,tmp,ans=-1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&tmp);
            if(mp[tmp])ans=max(ans,mp[tmp]+n-i);
            mp[tmp]=i;
        }
        printf("%d\n",ans);
    }
    return 0;
}

其实最关键的那步公式推导已经可以了,就差后面那些复杂的循环要减掉,还有那些为什么当有多个一样的数的时候,一下子没想到应该用用哪个最近的那个旧的去动。
难倒是不难,就是减循环的思维。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~晚风微凉~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值