今天老师在讲二分(别问我为啥,就是会了再听一遍),然后老师见我深基的查找使用 STL 二分函数的,就让我再写一遍。
我就是不想写二分,写了个用 vector
实现挂链法的哈希(不想打链表 ing),吸了氧气,结果跑不过二分,是 vector
常数太大了还是我实现有错误。
这是为啥啊,给出两个代码
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int up,low,mid=0;
int n,m;
cin>>n>>m;
int a[n+1],b[m+1];
for(int p=1;p<=n;p++)cin>>a[p];
for(int p=1;p<=m;p++)cin>>b[p];
for(int p=1;p<=m;p++)
{
int ans=lower_bound(a+1,a+n+1,b[p])-a;
if(a[ans]!=b[p])cout<<"-1 ";
else cout<<ans<<' ';
}
}
#include<iostream>
#include<vector>
#define MOD 1000000
using namespace std;
struct node{
int val,id;
node(int v,int i)
{val=v,id=i;}
};
vector<node>hs[MOD+10];
struct Hash{
int get_hash(int val)
{
return val%MOD;
}
void insert(int val,int id)
{
int pos=get_hash(val);
hs[pos].push_back(node(val,id));
}
int find(int val)
{
int pos=get_hash(val);
for(int p=0;p<hs[pos].size();p++)
if(hs[pos][p].val==val)
return hs[pos][p].id;
return -1;
}
};
int main()
{
int n,m;
cin>>n>>m;
Hash has;
for(int p=1,x;p<=n;p++)
cin>>x,has.insert(x,p);
for(int p=1,x;p<=m;p++)
cin>>x,cout<<has.find(x)<<' ';
}