欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从拾ACM——poj1002解题报告

程序员文章站 2022-05-21 23:30:37
...

 一道很基础的字符串处理问题。

题目大意:

给你n个字符串,其中有一些字符串是等价的。因为:

A, B, and C 等于 2 
D, E, and F 等于 3 
G, H, and I 等于 4 
J, K, and L 等于 5 
M, N, and O 等于 6 
P, R, and S 等于 7 
T, U, and V 等于 8 
W, X, and Y 等于 9 

所以:

TUT-GLOP 等于 888-4567

310-GINO 等于 310-4466

 

最后需要你将这n个字符串归类,并统计每种字符串有多少个

 

输入样例:

12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279

输出样例:

310-1010 2
487-3279 4
888-4567 3

 

解题思路:

因为每个字符串都为7位,最后要求按照阿拉伯数字输出。所以最大的数字也就只有9999999,直接牺牲内存创建一个长度为10000000的数组,数组的下标就是该字符串,数组存放的内容就是该字符串出现的次数。

打印时注意一下就好了printf("%03d-%04d %d\n", i/10000, i%10000, ar[i]);

#include <iostream>
#include <stdio.h>

using namespace std;

int ar[10000001] = {0};

//打印结果
void print(){
    bool flag = true;

    for (int i = 0; i < 10000000; i++){
        if (ar[i] > 1){
            flag = false;
            printf("%03d-%04d %d\n", i/10000, i%10000, ar[i]);
        }
    }

    if (flag){
        printf("No duplicates.\n");
    }
}


//将字符串转为数字
int stoi(char* s){
    int num = 0, i = 0;

    while (s[i] != '\n' && s[i] != '\0'){
        if ('0' <= s[i] && s[i] <= '9'){
            num = num * 10 + s[i] - '0';
        }else if ('A' <= s[i] && s[i] <= 'P'){
            num = num * 10 + (s[i] - 'A')/3 + 2;
        }else if ('R' <= s[i] && s[i] <= 'Y'){
            num = num * 10 + (s[i] - 'A' - 1)/3 + 2;
        }
        i++;
    }

    return num;
}

int main(){
    int num;
    char s[200];

    cin >> num;
    for (int i = 0; i < num; i++){
        scanf("%s",s);
        ar[stoi(s)]++;
    }

    print();
    return 0;
}

 

相关标签: ACM

上一篇: Noip2011题解报告

下一篇: 决策树