Shopping HDU - 2648 map/字符串哈希

Every girl likes shopping,so does dandelion.Now she finds the shop is increasing the price every day because the Spring Festival is coming .She is fond of a shop which is called "memory". Now she wants to know the rank of this shop's price after the change of everyday.

InputOne line contians a number n ( n<=10000),stands for the number of shops.
Then n lines ,each line contains a string (the length is short than 31 and only contains lowercase letters and capital letters.)stands for the name of the shop.
Then a line contians a number m (1<=m<=50),stands for the days .
Then m parts , every parts contians n lines , each line contians a number s and a string p ,stands for this day ,the shop p 's price has increased s.
OutputContains m lines ,In the ith line print a number of the shop "memory" 's rank after the ith day. We define the rank as :If there are t shops' price is higher than the "memory" , than its rank is t+1.Sample Input

3
memory
kfc
wind
2
49 memory
49 kfc
48 wind
80 kfc
85 wind
83 memory

Sample Output

1
2
map求解:
#include<iostream>
#include<map>
#include<string>

using namespace std;

map<string,int>f;
string name[10005];

int main()
{
    int n,m,num;
    while(cin>>n)
    {
        f.clear();
        for(int i=0; i<n; i++)
        {
            cin>>name[i];
            f[name[i]]=0;
            if(name[i]=="memory") num=i;
        }
        cin>>m;
        while(m--)
        {
            string temp;
            int cnt=0;
            int up;
            for(int i=0; i<n; i++)
            {
                cin>>up>>temp;
                f[temp]+=up;
            }
            for(int i=0; i<n; i++)
            {
                if(f[name[i]]>f[name[num]]) cnt++;
            }
            cout<<cnt+1<<endl;
        }
    }
    return 0;
}

字符串哈希:

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<iomanip>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const int mx = 1001; //check the limits, dummy
typedef pair<int, int> pa;
const double PI = acos(-1);
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a * b / gcd(a, b); }
bool isprime(int n) { if (n <= 1)return 0; for (int i = 2; i * i <= n; i++)if (n % i == 0)return 0; return 1; }
#define swa(a,b) a^=b^=a^=b
#define re(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define rb(i,a,b) for(ll i=(a),_=(b);i>=_;i--)
#define clr(a,b) memset(a, b, sizeof(a))
#define lowbit(x) ((x)&(x-1))
#define mkp make_pair
//inline ll qpow(ll a, ll b) { return b ? ((b & 1) ? a * qpow(a * a % mod, b >> 1) % mod : qpow(a * a % mod, b >> 1)) % mod : 1; }
//inline ll qpow(ll a, ll b, ll c) { return b ? ((b & 1) ? a * qpow(a * a % c, b >> 1) % c : qpow(a * a % c, b >> 1)) % c : 1; }
void ca(int kase, int ans) { cout << "Case #" << kase << ": " << ans << endl; }
void sc(int& x) { scanf("%d", &x); }void sc(int64_t& x) { scanf("%lld", &x); }void sc(double& x) { scanf("%lf", &x); }void sc(char& x) { scanf(" %c", &x); }void sc(char* x) { scanf("%s", x); }
int n, m, tt, k;
#define 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()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    
    int p[N],key,add,memory_price,rank,len;
    char s[35];
    node t;
    while (cin >> n) {
        re(i, 0, N)List[i].clear();
        re(i, 0, n) {
            cin >> t.name;
            key = BKDRHash(t.name) % N;
            List[key].push_back(t);
        }
        cin >> m;
        while (m--)
        {
            rank = len = 0;
            re(i, 0, n) {
                cin >> add >> s;
                key = BKDRHash(s) % N;
                re(j,0,List[key].size())
                    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;
                    }
            }
            re(i, 0, len)
                if (memory_price < p[i])
                    rank++;
            cout << rank + 1 << endl;
        }
    }
    return 0;
}

 

posted @ 2020-05-10 12:01  XXXSANS  阅读(219)  评论(0编辑  收藏  举报