BZOJ 2761: [JLOI2011]不重复数字 hash哈希

题目就不贴了

点我看题

题意:这题题意很简明,就是给一个序列,把序列里相同的删掉,然后输出,按原数列顺序。

思路:这题之前QZZ和ZN大神犇叫我去做,辣时还不会hash,就留着了。最近某夏令营学会了hash就回来写。

就是很简单的hash裸题。

我的hash就是把数字的每一位加起来然后累乘再膜。

从夏令营中涨了姿势,hash可以选择不判重,然后直接通过多hash的方法减少碰撞概率。

QAQ...刚开始以为3hash就够了,最后5hash才水过去。QAQ注意输出格式,行末没空格。

  1 const
  2    base1=23333;
  3    base2=66666;
  4    base3=23366;
  5    base4=66233;
  6    base5=12345;
  7    QZZ=182029; //膜神犇RP++
  8    HR=199999;//膜神犇RP++
  9    TJM=172709;//膜神犇RP++
 10    ZN=198719;//膜神犇RP++
 11    HJW=198953;//膜神犇RP++
 12 var n:longint;
 13     s:string;
 14     num:longint;
 15     a:array[0..50000]of longint;
 16     i,j,x,y,k:longint;
 17     hash1,hash2,hash3,hash4,hash5:int64;
 18     v1,v2,v3,v4,v5:array[0..1,0..200000]of boolean;
 19     bool:integer;
 20     t,qaq:longint;
 21 begin
 22   read(t);
 23   for qaq:=1 to t do
 24   begin
 25     read(n);
 26     for i:=0 to 1 do
 27     for j:=0 to 200000 do
 28     begin
 29       v1[i,j]:=false;
 30       v2[i,j]:=false;
 31       v3[i,j]:=false;
 32       v4[i,j]:=false;
 33       v5[i,j]:=false;
 34     end;
 35     num:=0;
 36     for i:=1 to n do
 37     begin
 38       read(x);
 39       if x>=0 then bool:=0 else
 40       begin
 41         bool:=1;
 42         x:=-x;
 43       end;
 44       str(x,s);
 45       if bool=1 then x:=-x;
 46       hash1:=1;
 47       hash2:=1;
 48       hash3:=1;
 49       hash4:=1;
 50       hash5:=1;
 51       for j:=1 to length(s) do
 52       begin
 53         hash1:=(hash1*base1+ord(s[j])) mod QZZ;
 54         hash2:=(hash2*base2+ord(s[j])) mod HR;
 55         hash3:=(hash3*base3+ord(s[j])) mod TJM;
 56         hash4:=(hash4*base4+ord(s[j])) mod ZN;
 57         hash5:=(hash5*base5+ord(s[j])) mod HJW;
 58       end;
 59       if (not v1[bool][hash1]) then
 60       begin
 61         v1[bool][hash1]:=true;
 62         v2[bool][hash2]:=true;
 63         v3[bool][hash3]:=true;
 64         v4[bool][hash4]:=true;
 65         v5[bool][hash5]:=true;
 66         inc(num);
 67         a[num]:=x;
 68       end else
 69       if (not v2[bool][hash2]) then
 70       begin
 71         v2[bool][hash2]:=true;
 72         v3[bool][hash3]:=true;
 73         v4[bool][hash4]:=true;
 74         v5[bool][hash5]:=true;
 75         inc(num);
 76         a[num]:=x;
 77       end else
 78       if (not v3[bool][hash3]) then
 79       begin
 80         v3[bool][hash3]:=true;
 81         v4[bool][hash4]:=true;
 82         v5[bool][hash5]:=true;
 83         inc(num);
 84         a[num]:=x;
 85       end else
 86       if (not v4[bool][hash4]) then
 87       begin
 88         v4[bool][hash4]:=true;
 89         v5[bool][hash5]:=true;
 90         inc(num);
 91         a[num]:=x;
 92       end else
 93       if (not v5[bool][hash5]) then
 94       begin
 95         v5[bool][hash5]:=true;
 96         inc(num);
 97         a[num]:=x;
 98       end;
 99     end;
100     for i:=1 to num-1 do
101     write(a[i],‘ ‘);
102     writeln(a[num]);
103   end;
104 end.

hash

时间: 2024-10-18 05:25:04

BZOJ 2761: [JLOI2011]不重复数字 hash哈希的相关文章

BZOJ 2761: [JLOI2011]不重复数字 水题

2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2100  Solved: 809 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2761 Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5

BZOJ 2761: [JLOI2011]不重复数字

Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4. Input 输入第一行为正整数T,表示有T组数据. 接下来每组数据包括两行,第一行为正整数N,表示有N个数.第二行为要去重的N个正整数. Output 对于每组数据,输出一行,为去重后剩下的数字,数字之间用一个空格隔开. Sample Input 2 11 1 2 18 3 3 19

2761: [JLOI2011]不重复数字

2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1770  Solved: 675[Submit][Status] Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4. Input 输入第一行为正整数T,表示有T组数据. 接下来每组数据包括两行,

2761: [JLOI2011]不重复数字(平衡树)

2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2133  Solved: 825[Submit][Status][Discuss] Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4. Input 输入第一行为正整数T,表示有T组数据. 接下来

bzoj2761: [JLOI2011]不重复数字(hash)

题目大意:给出N个数,要求把其中重复的去掉,只保留第一次出现的数.例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4. 随意哈希一下...[我不会什么set啊treap啊之类QAQ 代码如下: var t,n,i,x:longint; v:array[0..500009]of boolean; vv,b,a,ans:array[0..500009]of int64; function hash(x:int64):lo

[JLOI2011]不重复数字

2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 939[Submit][Status][Discuss] Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4. Input 输入第一行为正整数T,表示有T组数据. 接下来

BZOJ 2761 不重复数字 (Hash)

题解:直接使用STL中的hash去重即可 #include <cstdio> #include <map> using namespace std; int ans[50010]; int main(){ int T,n,tmp; scanf("%d",&T); while(T--){ int cnt=0; map<int,int>m; scanf("%d",&n); for(int i=0;i<n;i++)

题解 P4305 【[JLOI2011]不重复数字】

来一波用vector的最短代码题解 P4305 [JLOI2011]不重复数字 关于hash表的部分大家可以看一看其他的题解,我就不说了 不定长数组vector的几个基本用法: 定义: vector<数据类型> 数组名称 访问: a[pos]//访问a数组下标为pos的元素 尾部加入元素: a.push_back(x) 判断是否为空: a.empty()//空返回true,非空返回false 代码: #include <iostream> #include <cstdio&g

[BZOJ2761][JLOI2011]不重复数字

试题描述 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4. 输入 输入第一行为正整数T,表示有T组数据. 接下来每组数据包括两行,第一行为正整数N,表示有N个数.第二行为要去重的N个正整数. 输出 对于每组数据,输出一行,为去重后剩下的数字,数字之间用一个空格隔开. 输入示例 2 11 1 2 18 3 3 19 2 3 6 5 4 6 1 2 3 4 5