UVa 755 / POJ 1002 487--3279 (排序)(二)
S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9
Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。
如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)
你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。
Input
第一行指输入的测试数据组数,然后是一个空行。对于每组测试数据,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。每组测试数据间有一组空行。
Output
对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:
No duplicates.
每组输出间要输出一个空行。
思路:把所有电话号码转成int型整数,再排序。计数判断重复的,输出。
UVa:
/*0.209s*/ #include#include #include #include using namespace std; const int trans[] = {0, 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}; int ar[100010]; int main() { int t, n, i, j; char ch; bool fg; scanf("%d", &t); while (t--) { memset(ar, 0, sizeof(ar)); scanf("%d\n", &n); for (i = 0; i < n; ++i) while ((ch = getchar()) != 10) if (ch != '-') ar[i] = ar[i] * 10 + (isdigit(ch) ch & 15 : trans[ch & 31]); sort(ar, ar + n); fg = true; for (i = 0; i < n; i = j) { for (j = i; j < n && ar[j] == ar[i]; ++j) ; if (j - i > 1) printf("%03d-%04d %d\n", ar[i] / 10000, ar[i] % 10000, j - i), fg = false; } if (fg) puts("No duplicates."); if (t) putchar(10); } return 0; }
POJ:
/*266ms,748KB*/ #include#include #include using namespace std; const int trans[] = {0, 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}; int ar[100010]; int main() { int n, i, j; char ch; bool fg; scanf("%d\n", &n); for (i = 0; i < n; ++i) while ((ch = getchar()) != 10) if (ch != '-') ar[i] = ar[i] * 10 + (isdigit(ch) ch & 15 : trans[ch & 31]); sort(ar, ar + n); for (i = 0; i < n; i = j) { for (j = i; j < n && ar[j] == ar[i]; ++j) ; if (j - i > 1) printf("%03d-%04d %d\n", ar[i] / 10000, ar[i] % 10000, j - i), fg = false; } if (fg) puts("No duplicates."); return 0; }