题目链接: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;
}