码迷,mamicode.com
首页 > 编程语言 > 详细

集训第四周(高效算法设计)K题 (滑窗问题)

时间:2015-08-05 18:15:17      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

UVA 11572 唯一的雪花

 

题意:给你从1到n的数组,要求求得其中的最长连续不重复子序列,经典的滑窗问题,方法是维护一个窗口,设置左框和右框,然后不断的进行维护和更新

 

方法一:

#include"iostream"
#include"set"
#include"cstring"
#include"cstdio"
#include"algorithm"
using namespace std;
const int maxn=1000000+10;
set<int>book;
int a[maxn];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,t,sum=0,ans=0;
        cin>>n;
        book.clear();
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        int r=0,l=0;
        for(;r<n;)
          {
              while(!book.count(a[r])&&r<n)
              {
                  book.insert(a[r]);
                  r++;
              }
              ans=max(ans,r-l);
              book.erase(a[l]);
              l++;
           }
        cout<<ans<<endl;
    }
    return 0;
}

 方法二:

#include"iostream"
#include"set"
#include"cstring"
#include"cstdio"
#include"algorithm"
using namespace std;
const int maxn=1000000+10;
int pos[maxn];
int a[maxn];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,t,sum=0,ans=0;
        cin>>n;
        memset(pos,-1,sizeof(pos));
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        int r=0,l=0;
        a[n]=a[n-1];
        for(int i=0;i<=n;i++)
          {
             if(pos[a[i]]>=l)
             {
                 ans=max(ans,i-l);
                 l=pos[a[i]]+1;
             }
             pos[a[i]]=i;
          }
        cout<<ans<<endl;
    }
    return 0;
}

 

 

集训第四周(高效算法设计)K题 (滑窗问题)

标签:

原文地址:http://www.cnblogs.com/zsyacm666666/p/4705309.html

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