[Hash]統計數字
阿新 • • 發佈:2018-12-30
題目大意
給定n個數,每個數均不超過1.5*109,統計這些數各自出現的次數,並按照從小到大的順序輸出統計結果。
題目解析
資料規模有1.5*109,所以雜湊關鍵字本身作為地址會爆
所以想到用雜湊表
除了記錄某個S是否出現,還要記錄出現的次數,所以可以用一個二維陣列,加一個儲存出現次數的即可。
完後,將雜湊表裡的數放在一個新開的陣列,排序後輸出
#include<iostream> #include<cstdio> #include<algorithm> #define h(x) x%p #define p 1000007//質數 using namespace std; struct A { int x,n; }ans[p]; int n,x,a[p][2],num; //a[x][0] 記錄雜湊函式值為x的S值,a[x][2] 記錄這個 S 值出現了幾次 int loc(int x) { int k=h(x),i=0; while(a[(k+i)%p][0]!=0&&a[(k+i)%p][0]!=x) i++; return (k+i)%p; }//查詢關鍵字在雜湊表的位置 bool cmp(A a,A b) { return a.x<b.x; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); int t=loc(x); a[t][0]=x; a[t][1]++;//次數+1 } for(int i=1;i<p;i++) if(a[i][1]>0) { ans[++num].x=a[i][0]; ans[num].n=a[i][1]; } sort(ans+1,ans+1+num,cmp);//快速排序 for(int i=1;i<=num;i++) cout<<ans[i].x<<" "<<ans[i].n<<endl; }