题目大意:有N个datasets,每个datasets里面有N个电话号码,要求你找出相同的电话号码并统计出现的次数,并按升序输出电话号码+空格+出现次数,只输出大于等于2的电话号码
解题思路:纯for循环的话一定会爆,可以用一个数组存储每次出现的数字,然后在排序,那样的话每个电话号码就和其相同的相邻了,就不需要for那么多次了
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000010
using namespace std;
int num[maxn],change[256];
void init() {
for(int i = 0; i <= 9; i++)
change[i+'0'] = i;
for(int i = 'A', j = 2,k = 0; i <= 'O'; i++) {
if(k == 3) {
j++;
k = 0;
}
k++;
change[i] = j;
}
change['S'] = change['R'] = change['P'] = 7;
change['T'] = change['U'] = change['V'] = 8;
change['W'] = change['X'] = change['Y'] = 9;
}
int main() {
int test, N;
init();
scanf("%d",&test);
while(test--) {
char str[1000];
scanf("%d\n",&N);
int len,cnt = 0;
for(int i = 0; i < N; i++) {
gets(str);
len = strlen(str);
long long temp = 0;
for(int j = 0; j < len; j++)
if(str[j] != ' ' && str[j] != '-')
temp = temp * 10 + change[str[j]];
num[cnt++] = temp;
}
sort(num,num+cnt);
bool flag = false;
for(int i = 0; i < cnt; i++) {
int count = 0;
for(int j = i + 1; j < cnt && num[i] == num[j]; j++)
count++;
if(count) {
flag = true;
printf("%03d-%04d %d\n",num[i] / 10000,num[i] % 10000,count + 1);
i+= count;
}
}
if(!flag)
printf("No duplicates.\n");
if(test)
printf("\n");
}
return 0;
}