题目链接:http://poj.org/problem?id=1002
题意:给出一串由大写字母,数字,中划线组成的字符串。其中每个大写字母对应一个数字,让你求出这串字母对应的数字串(即电话号码),要求输出的数字串的第三位与第四位中间加一个中划线。
分析:用map将字母转换成数字,将整个字符串转换成一个整数,注意这个整数有可能不是七位的(有前导0),所以在输出的时候注意一下。字符串用scanf读,否则很可能会超时。
Code:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#define LL long long
#define pb push_back
#define pf push_front
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=100005;
int num[maxn];
map<int,int>mp;
map<char,int>mps;
int n,cnt=0;
char str[55];
bool isalp(char c){
if(c>='A'&&c<='Z') return true;
return false;
}
bool isnum(char c){
if(c>='0'&&c<='9') return true;
return false;
}
void solve(){
int ans=0,sz=strlen(str);
for(int i=0;i<sz;i++){
if(isalp(str[i])) ans=ans*10+mps[str[i]];
else if(isnum(str[i])) ans=ans*10+(str[i]-'0');
}
if(!mp[ans]) num[cnt++]=ans;
mp[ans]++;
}
int main()
{
scanf("%d",&n);
mps['A']=mps['B']=mps['C']=2;
mps['D']=mps['E']=mps['F']=3;
mps['G']=mps['H']=mps['I']=4;
mps['J']=mps['K']=mps['L']=5;
mps['M']=mps['N']=mps['O']=6;
mps['P']=mps['R']=mps['S']=7;
mps['T']=mps['U']=mps['V']=8;
mps['W']=mps['X']=mps['Y']=9;
while(n--){
scanf("%s",str);
solve();
}
sort(num,num+cnt);
bool flag=false;
for(int i=0;i<cnt;i++){
if(mp[num[i]]>1) {
flag=true;
printf("%03d-%04d %d\n",num[i]/10000,num[i]%10000,mp[num[i]]);
}
}
if(!flag) printf("No duplicates.\n");
return 0;
}