从拾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;
}
上一篇: Noip2011题解报告
下一篇: 决策树