首页 > 代码库 > HDU 4287 <map>的使用

HDU 4287 <map>的使用

对于这道题我主要要讲得是STL中map的简单使用。

先说说map的用处。

        map就是从键(key)到值(value)的映射。因为重载了[]运算符,map像数组的“高级版”,例如可以用一个map<string,int>month_name来表示“月份名字到月份编号”的映射,然后用month_name["July"] = 7这样的方式来赋值。

        它的意思就是map<string,int>month_name表示[ ] 里面代表的是string 而 map[] = __后面部分的值是int型。

       说完map的简单用法,我们来说说题目。

       题意:

                输入n,m.然后输入n的数字,再输入m的字母。计算通过手机的键盘按这些数字能否得到相应的字母,求满足该数字额字母有多少个


       做法:

                利用map对数字进行标记,然后通过把字母转换成相应的数字,放到对应的map里面看能不能找到标记的,如果标记就加一。

      代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
int ss[500];
string a[5005];
map<string, int>vm;
void Clear() {
    ///字母-'a'对应的数字
    memset(ss, 0, sizeof(ss));
    ss[0] = ss[1] = ss[2] = '2';
    ss[3] = ss[4] = ss[5] = '3';
    ss[6] = ss[7] = ss[8] = '4';
    ss[9] = ss[10] = ss[11] = '5';
    ss[12] = ss[13] = ss[14] = '6';
    ss[15] = ss[16] = ss[17] = ss[18] = '7';
    ss[19] = ss[20] = ss[21] = '8';
    ss[22] = ss[23] = ss[24] = ss[25] = '9';
}
int main() {
    Clear();
    int n, m, tc;
    scanf("%d", &tc);
    while(tc--) {
        ///vm的清空
        vm.clear();
        scanf("%d%d", &n, &m);
        for(int i = 0; i < n; i++) {
            string s;
            cin >> s;
            a[i] = s;
            vm[s] = 0;
        }
        for(int i = 0 ; i < m; i++) {
            string s1, s2;
            s1 = "";
            cin >> s2;
            for(int j = 0 ; j < s2.size(); ++j)
            {
                s1 += ss[s2[j]-'a'];
            }
            vm[s1] ++;
        }
        for(int i = 0;i < n;++i) cout  << vm[a[i]] << endl;
    }
    return 0;
}