摘要:
再次败给cin, cout, 记得输入规模在100000以上要用scanf, printf, fget等,别用cin, cout.
同时电话好码太少,用空间换时间的优势不明显,试过用sort,发现消耗的时间是一样的。。
#include <iostream>
#include <string>
#include <stdio.h>
#include <cassert>
#include <cmath>
#include <string.h>
using namespace std;
int hash_table[26] = {
2, 2, 2,
3, 3, 3,
4, 4, 4,
5, 5, 5,
6, 6, 6,
7, 7, 7, 7,
8, 8, 8,
9, 9, 9};
string myInt2Str(int num)
{
char buf[10];
sprintf(buf, "%d", num);
string str = buf;
return buf;
}
int records[10000000] = {0};
int pow_value[7] = {1, 10, 100, 1000, 10000, 100000, 1000000};
int main()
{
int n;
scanf("%d", &n);
int min_value = 0xffffffff;
int max_value = 0;
getchar();
for(int i=1; i<=n; i++){
char str[100];
fgets(str, 98, stdin);
int length = strlen(str);
int index = 6;
int value = 0;
for(int j=0; j<length; j++){
if(str[j] == '-'){
continue;
}
int num = 0;
if(str[j] >= 'A' && str[j] <= 'Z'){
num = hash_table[str[j]-'A'];
}else{
num = str[j]-'0';
}
value += num * pow_value[index];
index--;
if( index == -1){
break;
}
}
min_value = min(min_value, value);
max_value = max(max_value, value);
assert(index == -1);
records[value] += 1;
}
bool flag = false;
for(int i=min_value; i<=max_value; i++){
if( records[i] > 1 ){
flag = true;
string std_form = myInt2Str(i);
while(std_form.length() < 7){
std_form.insert(0, "0");
}
std_form.insert(3, "-");
printf("%s %d/n", std_form.c_str(), records[i]);
}
}
if( !flag ){
printf("No duplicates./n");
}
return 0;
}