请问我的“有道搜索框”什么地方导致超时?

windsting 2010-05-30 02:40:02
改了很多次,依然超时,没信心再试下去了,请各位指点,代码如下:

#include <iostream>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>

using namespace std;

struct StrLess
{
bool operator()(const char* a,const char* b)
{
return strcmp(a,b)<0;
}
};

typedef set<const char*,StrLess> StrSet;



int main()
{
char szTemp[32];
char ssDict[10001][32];
int iNum;
cin >> iNum;
StrSet s;
size_t iIdx=0;
while(iNum--)
{
scanf("%s",ssDict[iIdx]);
s.insert(ssDict[iIdx++]);
}

cin >> iNum;
StrSet::iterator end=s.end();
while(iNum--)
{
cin >> szTemp;
const size_t iLen = strlen(szTemp);
int iMatch=0;
for(StrSet::iterator it=s.lower_bound(szTemp); it!=end; ++it)
{
int iCmp = strncmp(*it,szTemp,iLen);
if(iCmp==0)
{
cout << *it << " ";
++iMatch;
}
if(iMatch>7)
break;
}
if(0==iMatch)
cout << szTemp;
cout << endl;
}
}
...全文
152 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
windsting 2010-05-30
  • 打赏
  • 举报
回复
终于Accept了,看来是set搜索效率不够导致的,ac的代码:
#include <iostream>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

struct StrLess
{
bool operator()(const char* a,const char* b)
{
return strcmp(a,b)<0;
}
};

typedef set<const char*,StrLess> StrSet;
typedef vector<const char*> StrVec;

int main()
{
char szTemp[32];
char ssDict[10001][32];
int iNum;
cin >> iNum;
StrSet s;
size_t iIdx=0;
while(iNum--)
{
scanf("%s",ssDict[iIdx]);
s.insert(ssDict[iIdx++]);
}

cin >> iNum;
StrSet::iterator end=s.end();
StrVec v;
v.reserve(s.size());
for(StrSet::iterator it=s.lower_bound(szTemp); it!=end; ++it)
{
v.push_back(*it);
}
StrVec::iterator vend=v.end();
while(iNum--)
{
cin >> szTemp;
const size_t iLen = strlen(szTemp);
int iMatch=0;
for(StrVec::iterator it=lower_bound(v.begin(),v.end(),szTemp,StrLess()); it!=vend; ++it)
{
int iCmp = strncmp(*it,szTemp,iLen);
if(iCmp==0)
{
cout << *it << " ";//((iMatch!=8)?" ":"");
++iMatch;
}
if(iMatch>7)
break;
}
if(0==iMatch)
cout << szTemp;
cout << endl;
}
}
windsting 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 logiciel 的回复:]
可用szTemp代替ssDict:

scanf("%s",szTemp);
s.insert(szTemp);
[/Quote]
这个不能用szTemp代替啊,插入到s中的是所有c风格字符串的指针,用szTemp代替的话,s里面有只有一个元素了,并且字典除了第一个输入项以外,都丢失了。
windsting 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cattycat 的回复:]
对,你那多了个空格。
还有,有必要用set吗,你set的第二个是个StrLess对象,实际上没用到吧,每次插入创建对象会费时的,改成int试试,把值设成0。
[/Quote]

StrLess是用来给set<char*>中的元素按照字典序排列用的,如果没有它,就按照指针数值的大小排列了,看了看别人的解答,感觉是set效率较低。
fanster28_ 2010-05-30
  • 打赏
  • 举报
回复
trie树
#include <stdio.h>
#include <string.h>
#include <memory.h>

struct node{
node *next[26];
int flag;
void init() {memset(next,0,sizeof(next));flag=0;}
};
node trien[200005],*root,*p,*rt;
int k,ok,len,num;
char str[21];

void insert(char *str)
{
int i=0,j;
p=root;
while (str[i])
{
j=str[i]-'a';
if (p->next[j]==0)
{
trien[k].init();
p->next[j]=&trien[k++];
}
p=p->next[j];
i++;
}
p->flag=1;
}

node* find(char *str)
{
int i=0,j;
p=root;
while (str[i])
{
j=str[i]-'a';
if (p->next[j]==0)
return 0;
p=p->next[j];
i++;
}
return p;
}

void ps(node *t)
{
int i;
if (num==8)
ok=1;
if (ok)
return;
if (t->flag==1)
{
str[len]='\0';
if (num==0)
printf("%s",str);
else
printf(" %s",str);
num++;
}
for (i=0;i<26;++i)
{
if (t->next[i]!=0)
{
str[len++]='a'+i;
ps(t->next[i]);
if (ok)
return;
}
}
len--;
}

int main()
{
int n,q;
trien[0].init();
root=trien;
k=1;
scanf("%d",&n);
while (n--)
{
scanf("%s",str);
insert(str);
}
scanf("%d",&q);
while (q--)
{
scanf("%s",str);
rt=find(str);
if (rt==0)
printf("%s",str);
else
{
num=ok=0;
len=strlen(str);
ps(rt);
}
printf("\n");
}
return 0;
}
baihacker 2010-05-30
  • 打赏
  • 举报
回复
代码可以私信联络。
baihacker 2010-05-30
  • 打赏
  • 举报
回复
解题报告
A题,直接模拟,写完的时候是五分钟,仔细检查了再交的,6分钟多了。
B题,很多人是排序加2分吧。
话说我当时傻了,干脆用了离线算法,把字典唯一化后,和输入的查询一起排序。
对于字符串相同的时候,查询的排在前面。对于一个查询,其结果当然就刚好跟在
其后面了。
C题,杯具了半天。
情况可能是:
小大小大小,这样直接求两个最大子段和就行了。
另外经过端点的时候是
大小大小大,于是把两个最小子段和找出来。
注意一些东西为空的时候,尤其是求最小子段和,全部是负数的时候,容易求出来答案是
0。于是可以记录一下大于0的数的个数,如果不走过2个,那么答案肯定是最大的两个数。
当然,也可以用一些优美的办法,把这个也处理进去。



我B题跑的时间是20毫秒。
我用的map进行唯一化。
liutengfeigo 2010-05-30
  • 打赏
  • 举报
回复

学习。学习
某某9 2010-05-30
  • 打赏
  • 举报
回复
没看出!
cattycat 2010-05-30
  • 打赏
  • 举报
回复
对,你那多了个空格。
还有,有必要用set吗,你set的第二个是个StrLess对象,实际上没用到吧,每次插入创建对象会费时的,改成int试试,把值设成0。
logiciel 2010-05-30
  • 打赏
  • 举报
回复
可用szTemp代替ssDict:

scanf("%s",szTemp);
s.insert(szTemp);
logiciel 2010-05-30
  • 打赏
  • 举报
回复
没有看出超时原因。但输出符合要求的单词时行尾多一个空格不知是否有格式问题。

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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