这题我脑残没注意到要求把答案按照升序输出于是随便hash搞了几个小时不知道哪错了。。。
思路就是hash然后排个序就行了,注意要用scanf不能用cin会超时。
还有个小坑就是没有答案要输出 No duplicates. 我这种不认真看题的总在这种地方吃亏...
代码比较冗长但比较好想还是挺好写的。
#include <iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std;
char zhuanhuan(char x)
{
if(x == 'A' || x == 'B' || x == 'C')
return '2';
if(x == 'D' || x == 'E' || x == 'F')
return '3';
if(x == 'G' || x == 'H' || x == 'I')
return '4';
if(x == 'J' || x == 'K' || x == 'L')
return '5';
if(x == 'M' || x == 'N' || x == 'O')
return '6';
if(x == 'P' || x == 'R' || x == 'S')
return '7';
if(x == 'T' || x == 'U' || x == 'V')
return '8';
if(x == 'W' || x == 'X' || x == 'Y')
return '9';
return '0';
}
struct node
{
char mapp[8];
long long has;
}a[100005];
bool compare(node x,node y)
{
return x.has < y.has;
}
int main()
{
int t;
int u = 0;
cin>>t;
getchar();
int w = -1;
for(int k = 0; k < t; ++k)
{
w++;
char shuru[500];
u = 0;
scanf("%s",shuru);
getchar();
int len = strlen(shuru);
bool mmp = 0;
for(int i = 0; i < len; ++i)
{
if(shuru[i] >='A'&&shuru[i]<='Z')
{
if(shuru[i] == 'Q'||shuru[i] == 'Z')
{
mmp = 1;
break;
}
a[w].mapp[u++] = zhuanhuan(shuru[i]);
}
else if(shuru[i]>='0'&&shuru[i]<='9')
{
a[w].mapp[u++] = shuru[i];
}
}
if(mmp)
{
w--;
continue;
}
a[w].has = 0;
int mi = 1;
for(int i = 7; i > 0; --i)
{
a[w].has += a[w].mapp[i-1] * mi;
mi*=10;
}
}
sort(a,a+w+1,compare);
int num = 1;
bool ojbk = 1;
for(int i = 1; i <= w; ++i)
{
if(a[i].has == a[i-1].has)
{
num++;
}
if(a[i].has!=a[i-1].has)
{
if(num >= 2)
{
for(int j = 0; j < 7; ++j)
{
if(j == 3)
cout<<"-";
cout<<a[i-1].mapp[j];
}
cout<<" "<<num<<endl;
ojbk = 0;
}
num = 1;
}
}
if(num>=2)
{
for(int j = 0; j < 7; ++j)
{
if(j == 3)
cout<<"-";
cout<<a[w].mapp[j];
}
ojbk = 0;
cout<<" "<<num<<endl;
}
if(ojbk)
cout<<"No duplicates."<<endl;
return 0;
}
/*
2
QQQQQQQ
QQQQQQQ
*/