hud2648 -哈希或map

题目大意:给定n个商品

然后再m天内每个商品都有个增加的价格,问其中每天"memory”的价格排第几。

应ljm之邀差错,查了半天还是错,写了个map的终于a了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;
const int p = 233333;
const int t = 103;

int n,m,v[p]={0},c[10010]={0},w;
char s[50],q[p][50]={""},s0[]="memory";
map<string,int>mp;
int main()
{   
	while(scanf("%d",&n) != EOF){
		for(int i=1;i <= n;i++){
			cin>>s;mp[s]=i;		
		}
		for(int i=1;i <= n;i++){
			cin>>s;
			cout<<mp[s]<<endl;		
		}
		scanf("%d",&m);
		memset(v,0,sizeof(v)) ;
		string s0="memory";
		int w=mp[s0];
		for(int i=1;i <= m;i++){
			for(int j=1;j <= n;j++){
				int u;
				scanf("%d",&u);
				cin>>s;
				int x=mp[s];
				v[x] +=u;//s的价格是u 
			}
					
			int ans = 0;
			for(int j=1;j <= n;j++)
				if(v[j] > v[w])
					ans++;
			printf("%d\n",ans+1);
		}
	}
	return 0;
}

然后再回来改哈希的。终于a掉的版本是这样的:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>

using namespace std;
const int p = 100007;
const int t = 51;

int n,m,v[p]={0},c[10010]={0},w;
char s[50],q[p][50]={""},s0[50]="memory";

inline int hashh(char *s){
    int l = strlen(s),x = 0;
    for(int i=0;i <l;i++)
        x = (x*t+s[i]-'a')%p;
    x=x%p;
    if(x<0)x+=p;
    return x;
} 

int put(int x,char *s) {
    while(q[x][0]){
            x++;
            if(x >= p)x -= p;
    }
    memcpy(q[x],s,50);
    return x;
}
int find(char *s,int x){
    while(strcmp(s,q[x])!=0){//找到memery的hash值 
            x++;
            if(x >= p)x -= p;
        }
    return x;
}
int main()
{   
    while(scanf("%d",&n) != EOF){
        for(int i=1;i <= n;i++){
            scanf("%s",s);
            int x = hashh(s);
            x=put(x,s);//开方地址的哈希 
            c[i] = x;//第i个商品存在hash值x内。            
        }
        int w = hashh(s0);//找到memewry的位置 
        w=find(s0,w);
        memset(v,0,sizeof(v));
        scanf("%d",&m);
        for(int i=1;i <= m;i++){
            for(int j=1;j <= n;j++){
                int u;
                scanf("%d",&u);
                scanf("%s",s);
                int x=hashh(s);
                x=find(s,x);
                v[x] +=u;//s的价格是u 
            }
            int ans = 0;
            for(int j=0;j <p;j++){
                if(v[j] > v[w])ans++;
            }                
            printf("%d\n",ans+1);
        }
    }
    return 0;
}


原来的最后统计是是:
	for(int j=1;j <=n;j++){
				if(v[c[j]] > v[w])ans++;
			}		
前面的统计写法虽然是对的,但明显时间复杂度太高啊。后面为什么是错的呢想了半天,可能输入数据有重复值,所以重新修改哈希,处理放入的重复情况。
终于顺畅的a掉了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>

using namespace std;
const int p = 100007;
const int t = 51;

int n,m,v[p]={0},c[10010]={0},w;
char s[50],q[p][50]={""},s0[50]="memory";

inline int hashh(char *s){
	int l = strlen(s),x = 0;
	for(int i=0;i <l;i++)
		x = (x*t+s[i]-'a')%p;
	x=x%p;
	if(x<0)x+=p;
	return x;
} 

int put(int x,char *s) {
	while(q[x][0]){
		if(strcmp(s,q[x])==0)return x;
		x++;
		if(x >= p)x -= p;
	}
	memcpy(q[x],s,50);
	return x;
}
int find(char *s,int x){
	while(strcmp(s,q[x])!=0){//找到memery的hash值 
			if(!q[x][0])return -1;
			x++;
			if(x >= p)x -= p;
		}
	return x;
}
int main()
{   
	while(scanf("%d",&n) != EOF){
		for(int i=1;i <= n;i++){
			scanf("%s",s);
			int x = hashh(s);
			x=put(x,s);//开方地址的哈希 
			c[i] = x;//第i个商品存在hash值x内。			
		}
		int w = hashh(s0);//找到memewry的位置 
		w=find(s0,w);
		memset(v,0,sizeof(v));
		scanf("%d",&m);
		for(int i=1;i <= m;i++){
			for(int j=1;j <= n;j++){
				int u;
				scanf("%d",&u);
				scanf("%s",s);
				int x=hashh(s);
			    x=find(s,x);
				if(x>=0)v[x] +=u;//s的价格是u 
			}
			int ans = 0;
			for(int j=1;j <=n;j++){
				if(v[c[j]] > v[w])ans++;
			}				
			printf("%d\n",ans+1);
		}
	}
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值