对于这道题我主要要讲得是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;
}
HDU 4287 <map>的使用,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u014325920/article/details/37600563