HDU2648:Shopping(DKBR_hash)
题意: 给出n个字符串,接下来m天,每天每个字符串要增加对应的值,询问“memory”每天的排名
分析:
用hash表hash出每个字符串对应得值,然后放入二维数组(防止地址冲突),m天,输入字符串,查找并处理,最后用一个数组记录每次得值
代码:
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int mod = 10007; struct node { char s[40]; int value; }a; int n,m,x,ret,now_value,now_size,xx,p[10007]; char s1[40]; vector<node>g[10007+2]; int get_hash(char *str) { int ret=0; while(*str) ret=ret*131+*str++; return ret&0x7fffffff%mod; } int main() { while(scanf("%d",&n)==1) { for(int i=0;i<10009;++i) g[i].clear(); for(int i=1;i<=n;++i) { scanf("%s",s1); strcpy(a.s,s1);a.value=0; g[get_hash(s1)].push_back(a); } scanf("%d",&m); while(m--) { int cnt=0; for(int i=1;i<=n;++i) { scanf("%d %s",&x,s1); now_value=get_hash(s1); now_size=g[now_value].size(); for(int j=0;j<now_size;++j) if(strcmp(g[now_value][j].s,s1)==0) { g[now_value][j].value+=x; ret=g[now_value][j].value; break; } if(strcmp(s1,"memory")==0) xx=ret;else p[++cnt]=ret; } int ans=0; for(int i=1;i<=cnt;++i) if(p[i]>xx) ans++; printf("%d\n",ans+1); } } }
-END-
一直地一直地往前走