题目大意:给定一些用字符,连接符,数字组成的号码,将这些号码按照规定格式,最终都转换为数字格式。输出重复的号码和次数。 解题思路:全存为数字后,快排,若某个号码出现多于2次则输出。 // 620k 782ms #include <iostream> #include <algorithm> #include <iomanip> #include <cstring> using namespace std; void initCtoi(char *c) { for (int i = '0'; i <= '9'; ++i) c[i] = i - '0'; c['A'] = c['B'] = c['C'] = 2; c['D'] = c['E'] = c['F'] = 3; c['G'] = c['H'] = c['I'] = 4; c['J'] = c['K'] = c['L'] = 5; c['M'] = c['N'] = c['O'] = 6; c['P'] = c['R'] = c['S'] = 7; c['T'] = c['U'] = c['V'] = 8; c['W'] = c['X'] = c['Y'] = 9; } int main() { //freopen("temp.txt", "r", stdin); int n, num; cin >> n; int *sort_out = new int[n]; char ch[32], ctoi['Z'+1]; //读入一行 initCtoi(ctoi); for (int i = 0; i < n; ++i) { cin >> ch; num = 0; for (int j = 0; ch[j] != 0; ++j) { if (ch[j] == '-' || ch[j] == 'Q' || ch[j] == 'Z') continue; num = num * 10 + ctoi[ ch[j] ]; } sort_out[i] = num; } sort(sort_out, sort_out+n); bool single = true; bool twice; int tmp, time; for (int i = 0; i < n; ) { tmp = sort_out[i]; time = 0; twice = false; while (tmp == sort_out[i] && i < n) { ++i; ++time; if (time == 2) { single = false; twice = true; } } if (twice) { cout << setfill('0') << setw(3) << tmp / 10000; cout << "-"; cout << setfill('0') << setw(4) << tmp % 10000; cout << ' ' << time << endl; } } if (single) cout << "No duplicates." << endl; delete sort_out; return 0; }