8-7 Unique Snowflakes UVA11572

输入一个长度为n n<=10 6  的序列A  找到一个尽量长的连续子序列  使得该序列中没有相同的元素

用滑动窗口法   时间复杂度n  好神奇

此题非常经典

map   410ms

#include<bits/stdc++.h>
using namespace std;
#define N 100000000
long  a[N];
int main()
{
   int cas;
   cin>>cas;
   while(cas--)
   {
       int n;cin>>n;
       for(int i=1;i<=n;i++)
          scanf("%ld",&a[i]);
       map<long,int>mp;
       mp.clear();
       int maxx=0;
       int j=1;
       for(int i=1;i<=n;i++)
         {
            int ok=1;
             while(ok&&j<=n)
             {
                 ok=0;
                 if(!mp[ a[j] ])
                 {
                     maxx=max(maxx,j-i+1);
                     mp[ a[j] ]++;
                     ok=1;
                 }
                 j++;
             }
             j--;
             mp[ a[i] ]--;
         }
       printf("%d\n",maxx);
   }
}

LRJ 的代码只用240!。。诶

注意set的erase用法

#include<bits/stdc++.h>
using namespace std;
#define N 100000000
int a[N];
int main()
{
    int cas;cin>>cas;
    while(cas--)
    {
        int n;cin>>n;
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        set<int>s;
        int L=0,R=0;
        int ans=0;
        while(R<n)
        {
            while(R<n&&!s.count(a[R]))s.insert(a[R++]);
            ans=max(ans,R-L);
            s.erase( a[L++]);
        }
        printf("%d\n",ans);
    }
}

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10425543.html