对于这道题我主要要讲得是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