【哈希表】Ural Championship April 30, 2017 Problem H. Hamburgers

题意:有n群人,每个人有喜欢的汉堡配方;有m家店,给出每家店的每个汉堡的配方,如果存在某个汉堡,其配料表包含某个人喜欢的配方,则这个人喜欢这个汉堡所在的店家。问你对每群人,输出被喜欢的人数最多的店面是哪家。

直接把每家店所能满足的口味表全塞到哈希表里面,暴力枚举统计即可。

这里用了双关键字哈希表,比较巧妙,是绝对的O(1)。

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
struct Man{
	int S;
	bool like[1005];
	Man(const int &S){this->S=S;memset(like,0,sizeof(like));};
	Man(){};
};
typedef vector<Man>::iterator ITER;
//5000011
//4000037
vector<Man>v[1005];
int n,m;
int pp,st[2][3200033];
int b[1005];
struct HashTable
{
	bool a[5000011],b[4000037];
    HashTable(){}
    void clear(){
		for(int i=1;i<=pp;++i){
			a[st[0][i]]=b[st[1][i]]=0;
		}
		pp=0;
	}
    void insert(const int &V){
    	int U1=V%5000011;
    	a[U1]=1;
    	int U2=V%4000037;
    	b[U2]=1;
        st[0][++pp]=U1;
        st[1][pp]=U2;
    }
    bool find(const int &V){
    	return (a[V%5000011] && b[V%4000037]);
    }
}T;
char s[105];
int len,S;
void dfs(int cur,int dep,int Snow){
	if(dep!=0){
		T.insert(Snow);
	}
	for(int i=cur;i<len;++i){
		dfs(i+1,dep+1,Snow|(1<<(s[i]-'a')));
	}
}
int main(){
//	freopen("h.in","r",stdin);
	int x;
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&x);
		for(int j=1;j<=x;++j){
			scanf("%s",s);
			len=strlen(s),S=0;
			for(int k=0;k<len;++k){
				S|=(1<<(s[k]-'a'));
			}
			v[i].push_back(Man(S));
		}
	}
	scanf("%d",&m);
	for(int i=1;i<=m;++i){
		scanf("%d",&x);
		for(int j=1;j<=x;++j){
			scanf("%s",s);
			len=strlen(s);
			dfs(0,0,0);
		}
		for(int j=1;j<=n;++j){
			for(ITER it=v[j].begin();it!=v[j].end();++it){
				if(T.find(it->S)){
					it->like[i]=1;
				}
			}
		}
		T.clear();
	}
	for(int i=1;i<=n;++i){
		memset(b,0,sizeof(b));
		for(ITER it=v[i].begin();it!=v[i].end();++it){
			for(int j=1;j<=m;++j){
				if(it->like[j]){
					++b[j];
				}
			}
		}
		int id=1;
		for(int j=2;j<=m;++j){
			if(b[j]>b[id]){
				id=j;
			}
		}
		printf("%d\n",id);
	}
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/7617749.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的影城管理系统,源码+数据库+论文答辩+毕业论文+视频演示 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多生活之,随之就产生了“小徐影城管理系统”,这样就让小徐影城管理系统更加方便简单。 对于本小徐影城管理系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计应用MySQL数据库来完成数据存储,具体根据小徐影城管理系统的现状来进行开发的,具体根据现实的需求来实现小徐影城管理系统网络化的管理,各类信息有序地进行存储,进入小徐影城管理系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理,用户前台;首页、电影信息、电影资讯、个人心、后台管理、在线客服等功能。 本论文主要讲述了小徐影城管理系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的小徐影城管理系统状况,提高管理效率。 关键词:小徐影城管理系统;Spring Boot框架,MySQL数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值