PKU_1002 TLE 求救~~~~

liaojinyu282 2009-10-25 12:20:39
题目链接 :http://acm.pku.edu.cn/JudgeOnline/problem?id=1002&lang=zh-CN
TLE 怎么才能过。。。。



#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
const char mapp[26] = {'2','2', '2', '3', '3', '3', '4', '4', '4', '5', '5', '5', '6', '6', '6', '7', '@', '7', '7', '8', '8', '8', '9', '9', '9', '@'};
void deal_str(string &s){ //处理字符串
for(int i=0;i<(int)(s.size());++i){
if(s[i]>='0'&&s[i]<='9'){}
else
if(s[i]>='A'&&s[i]<='Z'){
s[i]=mapp[s[i]-'A'];
if(s[i]=='@') {
s.erase(i,1);
--i;
}
}
else{
s.erase(i,1);
--i;
}
}
s.insert(3,1,'-');
}
int main(){
int n,i,num=1,j=0,x=0,sign=0;
cin>>n;
string *str=new string[n];
for(i=0;i<n;++i)
cin>>str[i];
for(i=0;i<n;++i)
deal_str(str[i]); //处理字符串
sort(str,str+n); //排序
for(i=0;i<n-1;){ //计数输出
num=1;
for(j=i+1;j<n;++j){
if(str[i]==str[j]){
++num;
x=j;
}
}
if(num>1)
sign=1;
i=x;
cout<<str[i]<<' '<<num<<endl;
}
else ++i;
}
if(sign==0) cout<<"No duplicates."<<endl;
delete []str;
return 0;
}
...全文
92 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liaojinyu282 2009-10-25
  • 打赏
  • 举报
回复
自己顶一下
liaojinyu282 2009-10-25
  • 打赏
  • 举报
回复
太谢谢了 呵呵 。。。。。。AC了 。。
这就结贴
zentropy 2009-10-25
  • 打赏
  • 举报
回复
计数的时候,已经排序,内层循环不需要从i+1到n,只要到不相等就行了
不然排序就没有意义
liaojinyu282 2009-10-25
  • 打赏
  • 举报
回复
string和cin/cout已经改了
仍然超时。。。。
zentropy 2009-10-25
  • 打赏
  • 举报
回复
(1)标准容器用的不好不要随便用
如果字符串长度是len,则erase和insert的时间复杂度是O(len)
也就是deal_str的时间复杂度是O(len^2)
而实际上多申请O(len)的空间,时间复杂度就可以降为O(len)
(2)cin/cout要比scanf/printf慢,特别是大量输入输出的时候表现很明显
不过在这个问题中,可能不是主要因素,但也值得一改
liaojinyu282 2009-10-25
  • 打赏
  • 举报
回复
咋没人呢。。。。
又写了一个版本 , 仍然超时。。。。大牛们帮忙看看吧

#include <algorithm>
#include <stdio.h>
#include <cstring>
#include <stdlib.h>
using namespace std;
const char mapp[26] = {'2','2', '2', '3', '3', '3', '4', '4', '4', '5', '5', '5', '6', '6', '6', '7', '@', '7', '7', '8', '8', '8', '9', '9', '9', '@'};
typedef struct my_str{
char ch[100];
int len;
}my_str,*my_string;

void deal_str(my_str &s,my_str &s1,int *t,int o){ //字符处理
int j=0;
for(int i=0;i<s.len&&j<8;++i){
if((s.ch)[i]>='0'&&(s.ch)[i]<='9'){
(s1.ch)[j++]=(s.ch)[i];
}

else if((s.ch)[i]>='A'&&(s.ch)[i]<='Z'){
if(mapp[(s.ch)[i]-'A']!='@')
(s1.ch)[j++]=mapp[(s.ch)[i]-'A'];
}
}
s1.ch[8]='\0';
t[o]=atoi(s1.ch);
}

int main(){
int n,num=1,j,x,sign=0;
my_string s,s1;

scanf("%d",&n);

s=new my_str[n];
s1=new my_str[n];
int *t=new int[n];

for(int i=0;i<n;++i){ //初始化
scanf("%s",s[i].ch);
s[i].len=(int)(strlen(s[i].ch));
}

for(int i=0;i<n;++i) //处理字符串
deal_str(s[i],s1[i],t,i);

sort(t,t+n);//排序

for(int i=0;i<n-1;){
num=1;
for(j=i+1;j<n;++j){
if(t[i]==t[j]){
++num;
x=j;
}
}
if(num>1){
sign=1;
printf("%03d-%04d %d\n",t[i]/10000,t[i]%10000,num);
i=x;
}
else ++i;
}

if(sign==0) printf("No duplicates.\n");
delete []s;delete []s1;delete []t;
return 0;
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧