题目链接:http://poj.org/problem?id=1002
题目大意:
给你一些由大写字母、数字、和'-'组成的字符串,并给出大写字母各自对应的数字。求出转换为数字后重复的次数。
解题思路:
简单模拟题,用map处理一下就行了。
不过在POJ上数据规模有点大,用字符串老超时,还得换成整数形式才A了。。。第一种是string(TLE了),第二种转换为整数
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> using namespace std; char fun(char a) { switch(a) { case 'A': case 'B': case 'C': return '2'; case 'D': case 'E': case 'F': return '3'; case 'G': case 'H': case 'I': return '4'; case 'J': case 'K': case 'L': return '5'; case 'M': case 'N': case 'O': return '6'; case 'P': case 'R': case 'S': return '7'; case 'T': case 'U': case 'V': return '8'; case 'W': case 'X': case 'Y': return '9'; default: return a; } } int main() { int ncase; int len; char str[20]; scanf("%d", &ncase); map<string, int>mp; map<string, int>::iterator start, end; string temp; for(int i = 0;i < ncase; ++i) { string s = ""; string ans = ""; scanf("%s", str); len = strlen(str); for(int i = 0; i < len; ++i) if((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= '0' && str[i] <= '9')) s += fun(str[i]); mp[s] += 1; } for(start = mp.begin(), end = mp.end(); start != end; ++start) { if(start->second != 1) { for(int i = 0; i < 7; ++i) { cout<<start->first[i]; if(i == 2) printf("-"); } printf(" %d\n", start->second); } } return 0; }
#include <iostream> #include <cstdio> #include <cstring> #include <set> #include <map> using namespace std; int num[] = { 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 0, 7, 7, 8, 8, 8, 9, 9, 9 }; map<int, int> s; char buf[128]; int main() { int t; scanf("%d", &t); bool flag = false; for(int i = 0; i < t; i++) { scanf("%s", &buf); int c = 0; for(int j = 0; buf[j]; j++) { if(isdigit(buf[j])) c = c * 10 + buf[j] - '0'; else if(isalpha(buf[j])) c = c * 10 + num[ buf[j] - 'A' ]; } s[c]++; } for(map<int, int>::iterator it = s.begin(); it != s.end(); it++) if(it->second > 1) { flag = true; printf("%03d-%04d %d\n", it->first / 10000, it->first % 10000, it->second); } if(!flag) puts("No duplicates."); return 0; }