HashMap簡單實現詢問long long範圍內資料出現的個數
阿新 • • 發佈:2019-02-11
題意:給出n個long long範圍內的數,以及q個詢問,每次詢問x 輸出數x出現的次數
思路:將每個數取模%MOD,用鄰接表儲存資料,當前節點儲存的是一個key的值v,以及v出現的次數,和與它取mod相等的上一個數
程式碼:
#include <iostream> #include <cstring> #include <cstdio> #include <fstream> using namespace std; #define MOD 100000 typedef long long ll; struct edge{ ll v; int next; int num; edge(){} edge(ll v,int num,int next):v(v),num(num),next(next){} }Hash[100100]; int head[100100],tot=0; int pd(int val,ll key){ int num=0; for(int i=head[val];i!=-1;i=Hash[i].next){ if(key == Hash[i].v) num++; } return num; } void Add(ll key){ int val = key%MOD; if(pd(val,key)){ Hash[tot] = edge(key,pd(val,key)+1,head[val]); head[val] = tot++; } else{ Hash[tot] = edge(key,1,head[val]); head[val] = tot++; } } int Find(ll key){ int val = key%MOD; for(int i=head[val];i!=-1;i=Hash[i].next){ if(key == Hash[i].v) return Hash[i].num; } return 0; } int main(){ memset(head,-1,sizeof(head)); int n,q; scanf("%d%d",&n,&q); for(int i=1;i<=n;i++){ ll x; cin>>x; Add(x); } while(q--){ ll x; cin>>x; cout<<Find(x)<<endl; } return 0; }