又写了一道水题,按照顺序写的。不知道能不能坚持下去。
#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;
}