1. 程式人生 > >問題 J: 【雜湊和雜湊表】收集雪花--map疑惑

問題 J: 【雜湊和雜湊表】收集雪花--map疑惑

問題 J: 【雜湊和雜湊表】收集雪花

時間限制: 1 Sec  記憶體限制: 128 MB
提交: 8  解決: 6
[提交] [狀態] [討論版] [命題人:admin]

題目描述

不同的雪花往往有不同的形狀。在北方的同學想將雪花收集起來,作為禮物送給在南方的同學們。一共有n個時刻,給出每個時刻下落雪花的形狀,用不同的整數表示不同的形狀。在收集的過程中,同學們不希望有重複的雪花。你可以從任意a時刻開始,在b時刻停止。a到b時刻中間的雪花也都將被收集。他們希望收集的雪花最多。

輸入

第一行一個正整數n;第2行到第n+1行表示n個時刻雪花的形狀。

輸出

最多能收集雪花的數量。

樣例輸入

5
1 2 3 2 1

樣例輸出

3

提示

n≤106,xi≤109

 

一看資料,1e6,1e9,用什麼hash啊,map不好嗎,(雖然map也算hash的一種)

然而寫出程式一除錯,誒,怎麼不對,????

奇怪的是想輸出下map裡存的值,輸出之後全是0,然後結果也不對了。。。

調瞎。。。發現map裡的.count()有問題。。不用之後就好了= 。=|||

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+7;
map<int,bool> M;
int a[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int l,r,ans = 0;
    l = 0,r = 0;
    while(r<n){
        if(!M[a[r]])///!M.count(a[r]),有問題
            M[a[r]] = 1;
        else{
            while(a[l] != a[r])
                M[a[l++]] = 0;
            l++;
        }
        //printf("%d-->%d\n",l,r);
        //printf("----%d-%d-%d\n",M[1],M[2],M[3]);
        ans = max(ans,r-l+1);
        r++;
    }
    printf("%d\n",ans);

    return 0;
}