Eisen's Blog

© 2024. All rights reserved.

POJ-1002

April 08, 2012

又写了一道水题,按照顺序写的。不知道能不能坚持下去。

1002


#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cstdio>
/* 
 * https://poj.org/problem?id=1002
 * 
 * 题简单的没什么可说的 重点是更快的输入处理能力
 * AC 的耗时很长,肯定有优化的余地,我只是个菜鸟,
 * 仅供参考
 *
 * @author: aisensiy(https://weibo.com/alistapart)
 */
using namespace std;
// 这是 A-Z 与数字的映射表
int charmap[26] = {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, 9};
// 这就是带我 AC 的函数 如果用 C++ 的 getline 的话 是过不了的!
void _getline(char *line, int lim) {
	int c, i;
	for(i=0; i<lim-1 && (c=getchar())!='n' && c != EOF; i++)
		line[i] = c;
	line[i] = '\0';
}
int main() {
	int n;
	string line, res;
	vector<string> lines;
	map<string, int> countmap;
	char _line[128];
	cin>>n;
	getline(cin, line);
	for(int i=0; i<n; i++) {
		//这是原来的语句
		//getline(cin, line);
		_getline(_line, 128);
		line = _line;
		//cout<<line<<" ";
		res = "";
		for(int i=0, c=0; i!=line.size(); i++) {
			if(line[i] <= '9' && line[i] >= '0') { res += line[i]; c++; }
			else if(line[i] <= 'Z' && line[i] >= 'A') { res += charmap[line[i] - 'A'] + '0'; c++; }
			if(c == 3) { res += '-'; c++; }
		}
		//cout<<res<<endl;
		countmap.count(res) ? countmap[res]++ : countmap[res] = 1;
	}
	vector<string> output;
	for(map<string, int>::iterator i = countmap.begin(); i != countmap.end(); ++i) {
		if(i->second > 1) output.push_back(i->first);
	}
	if(output.size() == 0) cout<<"No duplicates."<<endl;
	else {
		sort(output.begin(), output.end());
		for(int i=0; i!=output.size(); i++)
			cout<<output[i]<<" "<<countmap[output[i]]<<endl;
	}
	return 0;
}