poj1002 487-3279

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 315192   Accepted: 56155

Description

企業喜歡用容易被記住的電話號碼。讓電話號碼容易被記住的一個辦法是將它寫成一個容易記住的單詞或者短語。例如,你需要給滑鐵盧大學打電話時,可以撥打TUT-GLOP。有時,只將電話號碼中部分數字拼寫成單詞。當你晚上回到酒店,可以通過撥打310-GINO來向Gino's訂一份pizza。讓電話號碼容易被記住的另一個辦法是以一種好記的方式對號碼的數字進行分組。通過撥打必勝客的“三個十”號碼3-10-10-10,你可以從他們那裏訂pizza。 

電話號碼的標準格式是七位十進制數,並在第三、第四位數字之間有一個連接符。電話撥號盤提供了從字母到數字的映射,映射關係如下: 
A, B, 和C 映射到 2 
D, E, 和F 映射到 3 
G, H, 和I 映射到 4 
J, K, 和L 映射到 5 
M, N, 和O 映射到 6 
P, R, 和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. 

Sample Input

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

Sample Output

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

Source
East Central North America 1999

感想:
           1. 1002當然是沒有難度的,拿來練手比較適合,但這題也容易出錯,對字符串的處理也讓我找出自己的一些問題
           2. 比如map傳char數組作爲key的問題我解決不了,只能用string;
           3. 關於string的一些運算也要注意,比如使用下表的時候要注意,如果用str[k++]='a'的形式,要小心出界,要提前resize,reverse是不行的,因爲只是留了內存空間而沒有建立對象,用下標調用會出錯,而用resize則調用了默認構造函數來生成字符填滿空間,所以建議用+=來拼接或者知道長度的話用substr來截取;
           4. 用gets_s(gets的新版)比cin快了大約1/5,但要在前面適當的地方加getchar讀入殘留換行符
           4. 還有,poj應該是c++98,不支持auto,必須完整定義迭代器;
           5. 最後,昨天做科大訊飛筆試的時候我傻了,給字符數組str1讀入,然後按照一定要求複製到str2的時候忘了在最後加 '\0', 導致燙燙燙燙燙!唉!

#include <iostream>
#include <map>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;

map<string, int>mmap;
int main()
{
	int N;
	int len;
	int kk;
	char arr[200];
	string arr2;
	arr2.reserve(200);
	//arr2.resize(200);
	int k;
	int i, j;

	//傳char[]不行,那隻能傳string,那麼可以預留+拼接來提示效率
	while (cin>>N)
	{
		kk = 0;
		getchar();  //!!!!
		for (i = 0; i < N; ++i)
		{
			gets_s(arr);   //gets_s比cin快了大約1/5,但要在適當的地方用getchar()
			k = 0;
			j = 0;
			arr2 = "";
			while(arr[j]!='\0')
			{
				if (arr2.length() == 3)
					arr2 += '-';
				if (arr[j] == 'A' || arr[j] == 'B' || arr[j] == 'C')
				{
					//arr2[k++] = '2';
					arr2 += '2';
				}
				else if (arr[j] == 'D' || arr[j] == 'E' || arr[j] == 'F')
				{
					arr2 += '3';
				}
				else if (arr[j] == 'G' || arr[j] == 'H' || arr[j] == 'I')
				{
					arr2 += '4';
				}
				else if (arr[j] == 'J' || arr[j] == 'K' || arr[j] == 'L')
				{
					arr2 += '5';
				}
				else if (arr[j] == 'M' || arr[j] == 'N' || arr[j] == 'O')
				{
					arr2 += '6';
				}
				else if (arr[j] == 'P' || arr[j] == 'R' || arr[j] == 'S')
				{
					arr2 += '7';
				}
				else if (arr[j] == 'T' || arr[j] == 'U' || arr[j] == 'V')
				{
					arr2 += '8';
				}
				else if (arr[j] == 'W' || arr[j] == 'X' || arr[j] == 'Y')
				{
					arr2 += '9';
				}
				else if (arr[j] >= '0'&&arr[j] <= '9')
				{
					arr2 += arr[j];
				}
				++j;
			}
			//arr2[k] = '\0';
			mmap[arr2]++;
			
		}
	
		for (map<string, int>::iterator it = mmap.begin(); it != mmap.end(); ++it)
		{
			if (it->second == 1)continue;
			printf("%s %d\n", (it->first).c_str(), it->second);
			++kk;
		}
		if (kk == 0)printf("No duplicates.\n");
		mmap.clear();
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章