开始想用map映射,但只有一对一,没有多对一,囧~
这么算的话还是if的要快点。。。
但是没想到标程的自建map映射这么奇葩,就用一个数组 = =!!
效率是确实要比我的高啊。。。
#include
#include
#include
#include
using namespace std;
string num[100001];
int main()
{
int n;
char t[80]; //喵的这个开小的,然后RE = =
scanf("%d",&n);
for(int i = 0;i < n;i ++){
scanf("%s",t);
for(int k = 0;k < strlen(t);k ++){
if(t[k] == '-')continue;
if(t[k] >= '0' && t[k] <= '9')num[i]+=t[k];
if(t[k] >= 'A' && t[k] <= 'C')num[i]+='2';
if(t[k] >= 'D' && t[k] <= 'F')num[i]+='3';
if(t[k] >= 'G' && t[k] <= 'I')num[i]+='4';
if(t[k] >= 'J' && t[k] <= 'L')num[i]+='5';
if(t[k] >= 'M' && t[k] <= 'O')num[i]+='6';
if(t[k] >= 'P' && t[k] <= 'S')num[i]+='7';
if(t[k] >= 'T' && t[k] <= 'V')num[i]+='8';
if(t[k] >= 'W' && t[k] <= 'Y')num[i]+='9';
}
}
sort(&num[0],&num[0] + n);
int tmp = 0,flag = 0;
for(int i = 0;i < n;i ++){
if(num[i] == num[i+1])tmp ++;
else if(tmp){
printf("%s-%s %d\n",num[i].substr(0,3).data(),num[i].substr(3).data(),tmp + 1); //返回子串(string),转成char[]
flag = 1; //标记已输出
tmp = 0;
}
}
if(!flag)printf("No duplicates.\n");
return 0;
}
//5796kB 710ms
//附标程:1948kB 410ms
/*