//39556K 579MS G++
#include <cstring>
#include <cstdio>
using namespace std;
char number[50];
char AtoI[90];
void init() {
int beginVal = 2;
int cm = 0;
for (int i = 'A'; i <= 'Y'; i++) {
if (i != 'Q') {
AtoI[i] = beginVal;
// printf("%c %d\n", i, AtoI[i]);
cm++;
if (cm == 3) {
cm = 0;
beginVal++;
}
}
}
}
int transform(char * str) {
int weight = 1;
int length = strlen(str);
int digitNum = 0;
int res = 0;
for (int i = length-1; i >=0; i--) {
if (str[i] >= 'A' && str[i] <= 'Y') {
digitNum++;
int curDigit = AtoI[str[i]];
res += curDigit*weight;
weight *= 10;
} else if (str[i] >= '0' && str[i] <= '9'){
digitNum++;
int curDigit = str[i] - '0';
res += curDigit*weight;
weight *= 10;
}
if (digitNum == 7) {
return res;
}
}
return res;
}
const int MAX = 10000000;
int flagArray[MAX];
int num;
int main() {
init();
scanf("%d", &num);
for (int i = 0; i < num; i++) {
scanf("%s", number);
int val = transform(number);
// printf("%d\n", val);
flagArray[val]++;
}
int dupNum = 0;
for (int i = 0; i < MAX; i++) {
if (flagArray[i] >= 2) {
printf("%03d-%04d %d\n", i/10000, i%10000, flagArray[i]);
dupNum++;
}
}
if (dupNum == 0) {
printf("No duplicates.\n");
}
}
采用了bitmap来记录某个号码出现的次数,其实也可以用tire树,这样对空间就不会要求那么多,不过也没有MLE,就这样了。
其实还有思路,就是将号码全部转为7位数字时,可以进行排序,这样也能在遍历数组时判断重复次数,不过看到上限100000, 觉得排序估计也不快,就没搞(其实快排之类的都是log(n)级别,应该也没想想的那么慢)
最后输出忘了
No duplicates. 和 左边补0,WA了几次..