\operatorname
luogup
4305
給定 n
nn 個數,要求把其中重複的去掉,只保留第一次出現的數。
本題有多組資料。
第一行乙個整數 t
tt ,表示資料組數。
對於每組資料:
第一行乙個整數 n
nn 。
第二行 n
nn 個數,表示給定的數。
對於每組資料,輸出一行,為去重後剩下的數,兩個數之間用乙個空格隔開。
2111
21833
19236
5461
2345
6
1218
31965
4123
456
對於 30
%30\%
30% 的資料, n
≤100
n \le 100
n≤10
0 ,給出的數 ∈[0
,100
]\in [0, 100]
∈[0,10
0]。對於 60
%60\%
60% 的資料, n≤1
04
n \le 10^4
n≤10
4 ,給出的數 ∈[0
,104
]\in [0, 10^4]
∈[0,10
4]。對於 100
%100\%
100%
的資料, 1≤t
≤50
1 \le t\le 50
1≤t≤50
, 1≤n≤
5×10
41 \le n \le 5 \times 10^4
1≤n≤5×
104 ,給出的數在 32
3232
位有符號整數範圍內。
這道題是一道hash。
一般的hash會被卡掉(好像是的),我這裡用了一位大佬的方法,就是有重複的時候不加 1
11 ,而是加乙個很大的素數。(我用了 19260817
19260817
192608
17)還有,因為這個數可能是負數,我就把陣列數量翻倍,然後一半代表正數,一半代表負數。
#include
#include
#define mo 400000
#define ll long long
#define dazhishu 19260817
using
namespace std;
int t, n;
bool go0;
ll a[
50001
], in[
800005];
intmain()
continue;}
int hash = a[i]
% mo;
while
(in[hash + mo]!=0
&& in[hash + mo]
!= a[i]
) hash =
(hash + dazhishu)
% mo;
//找到它原來的位置或者新的位置
if(in[hash + mo]==0
)}printf
("\n");
//輸出換行
}return0;
}
不重複數字 unordered map
據說這道題加強了資料,卡普通雜湊,多模數雜湊,普通map,set 這時候就要祭出我們的大殺器 unordered map 定義和用法與普通map基本相同,只不過它的查詢是o 1 的 它的實現就是雜湊表 而普通map是o logn 的,那麼這道題就迎刃而解了 另 它還有個兄弟 unordered se...
JLOI2011 不重複數字
原題鏈結 題解題目大意 給出n個數,要求把其中重複的去掉,只保留第一次出現的數。最後按順序輸出 n 50000 然這題是個雜湊的典型題目 hash,我對於它的理解就是乙個桶 乙個數,當然並不是如此,有很多更好的hash函式可以更好的減少衝突,例如非十進位制數等。hash一般用來處理乙個元素是否在乙個...
「不重複數」問題
1 如果乙個數字十進位制表達時,不存在連續兩位相同,則稱之為 不重複數 例如,105 1234 12121都是不重複數,而11 100 1225不是。給定乙個正整數a,返回大於a的最小不重複數。a小於100000.示例 輸入 value 21099 返回 21201 本題的難點不在於判斷是否是不重複...