题目大意:给定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;
}