hdu2648(字符串哈希)

hdu2648

每个女孩都喜欢购物,蒲公英也是。现在,她发现这家店每天都在涨价,因为春节快到了。她很喜欢一家叫“memory”的店。现在她想知道这个商店的价格在每天变化后的排名。

输入:一行包含一个数字n (n<=10000),代表商店的数量。然后是n行,每行包含一个字符串(长度小于31,且只包含小写字母和大写字母),表示商店的名称。然后一行包含一个数字m (1<=m<=50),代表天数。然后m部分,每个部分包含n行,每一行包含一个数字s和一个字符串p,代表这一天,商店p的价格增加了s。

输出包含m行,在第i行打印商店“memory”的第i天后的排名的数字。我们将排名定义为:如果有t个商店的价格高于“memory”,那么它的排名为t+1。

输入:
3
memory
kfc
wind
2
49 memory
49 kfc
48 wind
80 kfc
85 wind
83 memory

输出:
1
2

代码

#include<bits/stdc++.h> 
using namespace std;
const int N = 10005;
struct node{
	char name[35];
	int price;
};

vector<node>List[N]; // 用来解决冲突 
unsigned int BKDRHash(char*str){      // 哈希函数 
	unsigned int seed = 31,key = 0;
	while(*str)
	key = key * seed + (*str++);
	return key & 0x7fffffff;
}

int main()
{
	int n,m,key,add,memory_price,rank,len;
	int p[N];
	char s[35];
	node t;
	while(cin >> n){
		for(int i = 0; i < N;i++)
		List[i].clear();
		for(int i = 0; i < n; i++){
			cin >> t.name;
			key = BKDRHash(t.name) % N;          //计算hash值并取余 
			List[key].push_back(t);				 //hash值可能冲突,把冲突的哈希值都存起来 
		}
		cin >> m;
		while(m--){
			rank = len = 0;
			for(int i = 0; i < n; i++){
				cin >> add >> s;
				key = BKDRHash(s) % N;			 //计算哈希值 
				for(int j = 0; j < List[key].size();j++){   //冲突问题处理 
					if(strcmp(List[key][j].name,s) == 0){
						List[key][j].price += add;
						if(strcmp(s,"memory") == 0){
							memory_price = List[key][j].price;
						}else{
							p[len++] = List[key][j].price;
						}
						break;
					}
				}
			}
			for(int i = 0; i < len; i++){
				if(memory_price < p[i])rank++;
			}
			cout << rank + 1 << endl;
		}
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值