北大 ACM 1002题 超时

我打算用2个方法做,第一用二维数组,成功accept了;这个用multimap的,修改,提交了20多次,还是TimeLimitExceeded.把代码放下边,大侠帮忙检查... 我打算用2个方法做,第一用二维数组,成功accept了;这个用multimap的,修改,提交了20多次,还是Time Limit Exceeded.把代码放下边,大侠帮忙检查下好吧:
#pragma warning(disable : 4786)

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <map>

using namespace std;

// 存放规范化后但未处理“重复性”的字符串
multimap <string, int> myMap;

// 最终字符串
// multimap在插入时就自动排好序了
multimap <string, int> myMap_2;

char info[32];

// 规范化
// 思路为: 1. 先将每一行的输入字符串中的字母,转换为数字,即“1234567”形式;
// 2. 再将步骤1中已转换好的格式进行格式的规范,即“123-4567”形式。
string myFormat(string s){

// 将字符串参数转换为对应的字符数组
char inString[32];
s.copy(inString,31,0);
*(inString+31)='\0';

// 声明一个临时存放不含“-”的中间转换数组
char tempS[8];

char mapEle[] = "22233344455566670778889990";
for(int i = 0,j = 0; i < 32;i++){
if(inString[i] == '-')
continue;
if(inString[i] >= 'A' && inString[i] < 'Z')
tempS[j] = mapEle[inString[i] - 'A'];
else
tempS[j] = inString[i];
j++;
}

// 必须令末位字符为'\0'!否则会出现“烫”!
tempS[8] = '\0';
tempS[7] = tempS[6];
tempS[6] = tempS[5];
tempS[5] = tempS[4];
tempS[4] = tempS[3];
tempS[3] = '-';

// 转换为字符串输出
string ss;
ss.assign(tempS);

return ss;
}

int main(void){

// 读内容
int nCases, k;
scanf("%d", &nCases);
for(k = 0; k < nCases; k++){
scanf("%s", info);
// 将已经规范化的字符串存入新的容器中
myMap.insert(multimap <string, int>::value_type (myFormat(info), 1));
}

// 迭代,处理重复的情况
multimap <string, int>::iterator iBegin = myMap.begin();
for(; iBegin != myMap.end(); iBegin++){
int sum = myMap.count(iBegin->first);
if(sum == 1)
continue;
else if(myMap_2.count(iBegin->first) == 0){
myMap_2.insert(multimap <string, int>::value_type (iBegin->first, sum));
cout << iBegin->first << " " << sum;
cout << endl;
}
}

if(myMap_2.empty())
cout << "No duplicates." << endl;

return 0;
}

=======================
解决问题,补送100分
展开
 我来答
Royce_wind
2009-12-29
知道答主
回答量:9
采纳率:0%
帮助的人:0
展开全部
首先,STL里面的容器本身运行速度就是很慢的,而且multimap的插入是O(log n)的,你大量使用遍历和插入肯定是要超时的

对于这个题,你可以研究下用vector <string>去存放,然后使用unique函数去除重复的

具体可以参考
http://www.diybl.com/course/3_program/c++/cppjs/20090522/167676.html
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式