码迷,mamicode.com
首页 > 其他好文 > 详细

收集雪花

时间:2019-10-04 15:11:34      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:style   相同   ace   pre   c++   scanf   line   sig   problem   

https://loj.ac/problem/10042

题目描述

  给出一段数字序列,求一段最长的连续的序列使其中的元素不重复。

思路

  这道题显然想要我们给出O(n)的算法,所以我们考虑用双指针,每当有指针右移时,判断加入的数是否出现过,出现过就接改变左指针。二是否出现过我们可以用Hash表维护,不过为了快速得到左指针的位置,我们插入每一个数时需要记录两个值,一个是模后的值,一个是位置。所以右指针右移时我们只要找到与它值相同的位置再右移一个就是最长的以它为右端点的序列。

代码

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const ull mod=1e6+9;
const ull MAXN=1e6+5;
ull nxt[MAXN],key[MAXN],poi[mod+5],num[MAXN],tot;
void insert(ull x,int p)
{
    ull h=x%mod;
    nxt[++tot]=poi[h];
    poi[h]=tot;
    key[tot]=x;
    num[h]=p;
}
bool check(ull x)
{
    int h=x%mod;
    for(int i=poi[h];i;i=nxt[i])
        if(key[i]==x)return 1;
    return 0;
}
int main() 
{
    int n;
    scanf("%d",&n);
    ull ans=0,l=1;
    for(int r=1;r<=n;r++)
    {
        ull a;
        scanf("%llu",&a);
        if(check(a)&&l<=num[a%mod])
            l=num[a%mod]+1;
        insert(a,r);
        ans=max(ans,r-l+1);
    }
    printf("%llu",ans);
    return 0;
}

 

收集雪花

标签:style   相同   ace   pre   c++   scanf   line   sig   problem   

原文地址:https://www.cnblogs.com/fangbozhen/p/11621902.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!