虽然网上都说这是一道水题,其实我也感觉这题思路满清晰的,但死活提交不通过,基本都是时间超了,后来勉强痛过了,但效果还是不怎么理想。这里做一个简单分析
1.我们一开始的程序是利用stl中的vector,string 等容器读入数据,然后自己写了一个快速排序的算法,对存储在vector<string>中的string串进行排序,可想而知,对字符串排序的效率是有多滴,尤其面对这道题这么变态的测试数据的时候。
2.我们后来将数据存到vector<int>中去,有效果,在测试bt的数据的时候,过了10s终于出来结果了,这是对快速排序对象的改善。但poj不接受。
3.后来,经过实验室师兄解释,vector,string 都会自动分配内存,并自动增长,但这里是对时间有要求的,对100000组数据而言,vector分配几次内存,显然不可接受,于是,我们就不能装B的使用容器了,开始转化用数组。
4.这里其实可以用快速排序实现,但是我们脑抽了,想到hash表蛮好的,就使用了hash表进行处理,但是服务器不支持用hash_map 编译不通过,于是我们换用map
5.输出格式是有要求的,如果使用string或char【】数组来输出,没有问题,但如果要用cout输出,就需要进行格式控制了。这里参考文章:http://blog.csdn.net/onlyou930/article/details/6638896
Source Code
Problem: 1002 | User: zhyh2010 | |
Memory: 3520K | Time: 1204MS | |
Language: C++ | Result: Accepted |
#include <iostream>
#include <map>
#include <iomanip>
using namespace std;
class PhoneNUM
{
public:
PhoneNUM();
~PhoneNUM();
void input();
void output();
protected:
void initmap();
private:
//int m_data[100001];
char m_input[50];
//char m_input[20];
size_t m_size;
map<char, char> m_map;
map<int, int> m_dict;
};
PhoneNUM::PhoneNUM()
{
m_size = 0;
initmap();
}
PhoneNUM::~PhoneNUM()
{
}
void PhoneNUM::input()
{
//cout << "input the number of the phones:\t" << endl;
cin >> m_size;
//string phone;
for (int i = 0; i != m_size; ++i )
{
cin >> m_input;
//handlePhone(phone);
int j = 0;
int temp = 0;
int res = 0;
while (m_input[j] != '\0')
{
if (m_input[j] == '-')
{
++j;
continue;
}
if (m_input[j] >= '0' && m_input[j] <= '9')
{
temp = m_input[j] - '0';
}
else
{
temp = m_map[m_input[j]];
}
res = 10 * res + temp;
++j;
}
//m_data[i] = res;
// dict handle
if (m_dict.count(res) == 0)
{
m_dict[res] = 1;
}
else
{
++m_dict[res];
}
}
}
void PhoneNUM::output()
{
bool isdul = false;
map<int, int>::const_iterator iter = m_dict.begin();
for (; iter != m_dict.end(); ++iter)
{
if (iter->second > 1)
{
isdul = true;
cout << setfill('0') << setw(3) << iter->first / 10000 << "-"
<< setfill('0') << setw(4) << iter->first % 10000 <<" "<< iter->second << endl;
}
}
if (isdul == false)
{
cout << "No duplicates." << endl;
}
}
void PhoneNUM::initmap()
{
m_map['A'] = 2;
m_map['B'] = 2;
m_map['C'] = 2;
m_map['D'] = 3;
m_map['E'] = 3;
m_map['F'] = 3;
m_map['G'] = 4;
m_map['H'] = 4;
m_map['I'] = 4;
m_map['J'] = 5;
m_map['K'] = 5;
m_map['L'] = 5;
m_map['M'] = 6;
m_map['N'] = 6;
m_map['O'] = 6;
m_map['P'] = 7;
m_map['R'] = 7;
m_map['S'] = 7;
m_map['T'] = 8;
m_map['U'] = 8;
m_map['V'] = 8;
m_map['W'] = 9;
m_map['X'] = 9;
m_map['Y'] = 9;
}
int main(int argc, char**argv)
{
PhoneNUM instance;
instance.input();
//instance.quicksort();
instance.output();
}