唯一的雪花(UVa 11572)

2021-09-27 09:57:38 字數 1880 閱讀 4008

map容器解法

使用hash_map

輸入乙個長度為n(n<=106)的序列a,找到乙個盡量長的連續子串行a

l–ar,使得該序列中沒有相同的元素。

set解法

因為序列中沒有相同的元素,比較容易想到用乙個stl中的set,儲存a[l~r]中元素的組合。

當r增大時判斷a[r+1]是否在set**現,如果不重複,此時要把a[r+1]插入set中

如果重複,移動l,在l+1時,要把a[l]從set中刪除。直到a[r+1]的值不重複。再插入a[r+1]。

因為set的插入和刪除都是o(logn)的,因此這演算法的複雜度為o(nlogn)。

//stl set別忘啦標頭檔案

#include

using

namespace std;

const

int maxn =

1000000+5

;int a[maxn]

;set <

int> s;

intmain()

s.erase

(a[l]);

l++; ans =

max(ans, r - l);}

cout << ans+

1<

// 因為序列從0開始排號,一定注意!輸出為ans+1

}return0;

}map容器解法

// uva11572 unique snowflakes

// rujia liu

// 演算法二:記錄位置i的上個相同元素位置last[i]

#include

#include

using

namespace std;

const

int maxn =

1000000+5

;int a[maxn]

, last[maxn]

;map<

int,

int> cur;

intmain()

int l =

0, r =

0, ans =0;

while

(r < n)

printf

("%d\n"

, ans);}

return0;

}

使用hash_map
// uva11572 unique snowflakes

// rujia liu

// 演算法二:記錄位置i的上個相同元素位置last[i]。使用hash_map(gcc擴充套件)

#include

#include

using

namespace std;

using

namespace __gnu_cxx;

// hash_map

const

int maxn =

1000000+5

;int a[maxn]

, last[maxn]

;hash_map<

int,

int> cur;

intmain()

int l =

0, r =

0, ans =0;

while

(r < n)

printf

("%d\n"

, ans);}

return0;

}

uva 11572 唯一的雪花 (滑動視窗)

題意 輸入乙個長度為n n 10 6 的序列a,找乙個盡量長的連續子串行a l a r 使得序列中沒有相同的元素。這道題要用滑動視窗的思想,右端點一直擴充套件直至右端點元素與視窗內元素重複時,刪除左端點元素直至右端點元素與視窗內元素不相同。找到視窗內元素最多時就是最長連續子串行。map實現 incl...

UVA 11572 唯一的雪花 滑動視窗

這道題採用滑動視窗的做法 set o n 首先l和r都指向a 0 這時我們擴充套件r,直到r擴充套件不了,我們擴充套件l,怎麼判斷r擴充套件不了了呢,可以用乙個set,把擴充套件過的元素全部insert到set裡,當a r 1 的元素已經在set裡出現過或者a r 已經是最後乙個元素,我們就不能再擴...

UVa 11572 唯一的雪花(滑動視窗)

問題 輸入乙個長度為n的序列a,找到乙個最長的連續子串行,使得該序列中沒有重複的元素。分析 假設序列元素從0編號,所求子串行的左端索引為l,右端索引為r。首先,l和r從0開始。判斷a r 是否在子串行中,如果不在子串行中,r增大 如果在子串行中,r無法增大。求連續子串行最大長度。l向右增大一,重複 ...