POJ1002

摘要:

再次败给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;        
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值