bestcoder#36 1002 哈希
Gunner
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 726 Accepted Submission(s): 326
Problem Description
Long long ago, there is a gunner whose name is Jack. He likes to go hunting very much. One day he go to the grove. There are
n birds and n trees. The i−th bird stands on the top of the i−th tree. The trees stand in straight line from left to the right. Every tree has its height. Jack stands on the left side of the left most tree. When Jack shots a bullet in height H to the right, the bird which stands in the tree with height H will falls.
Jack will shot many times, he wants to know how many birds fall during each shot.
a bullet can hit many birds, as long as they stand on the top of the tree with height of H .
Input
There are multiple test cases (about 5), every case gives
n,m in the first line, n indicates there are n trees and n birds, m means Jack will shot m times.
In the second line, there are n numbers h[1],h[2],h[3],…,h[n] which describes the height of the trees.
In the third line, there are m numbers q[1],q[2],q[3],…,q[m] which describes the height of the Jack’s shots.
Please process to the end of file.
[Technical Specification]
1≤n,m≤1000000(106)
1≤h[i],q[i]≤1000000000(109)
All inputs are integers.
Output
For each
q[i] , output an integer in a single line indicates the number of birds Jack shot down.
Sample Input
Sample Output
1
0
1
Hint
Huge input, fast IO is recommended.
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctype.h>
using namespace std;
const int maxn=1000100;
const int HM=1000100;
int n,m;
struct Hash
{
int date;
int cnt;
Hash *next;
};
Hash H[maxn];
inline int read()
{
char c=getchar();
while(!isdigit(c)) c=getchar();
int f=c-'0';
while(isdigit(c=getchar())) f=f*10+c-'0';
return f;
}
int h(int x)
{
return x%HM;
}
void insert(Hash*H,int date)
{
int key=h(date);
Hash *pre=&H[key],*p=pre->next;
while(p!=NULL){
if(p->date==date){
p->cnt++;
return;
}
pre=p;
p=p->next;
}
p=(Hash*)malloc(sizeof(Hash));
pre->next=p;
p->next=NULL;
p->date=date;
p->cnt=1;
}
void find_del_output(Hash*H,int date)
{
int key=h(date);
Hash *pre=&H[key],*p=pre->next;
while(p!=NULL){
if(p->date==date){
printf("%d\n",p->cnt);
pre->next=p->next;///删掉结点
free(p);
return;
}
pre=p;
p=p->next;
}
puts("0");
}
int main()
{
while(cin>>n>>m){
memset(H,0,sizeof(H));
while(n--){
int h=read();
insert(H,h);
}
while(m--){
int q=read();
find_del_output(H,q);
}
}
return 0;
}
View Code