回 帖 发 新 帖 刷新版面

主题:第34次编程比赛第2题比赛结果

通过测试的:

第 2 楼  @iAkiak          0.511s
第 3 楼  @diycai          0.184s
第 6 楼  @nwpuzhl         0.132s
第 9 楼  @magicalking     0.618s
第 11 楼 @天国龙          0.273s

错误或速度缓慢的:

第 4 楼 @天边蓝
初测组是对的,但是耗费掉非常多时间(49.678s),就未进行下一步测试(初测组只有长度 1000 的词典)。

第 8 楼 @yxs0001
初测组对,且很快,但到大数据量组就偏慢,1m26.476s,而且其中有问题,35 个待查的最后 10 个是不存在的,到你这变成存在的了。

第 10 楼 @SonicLing
初测组对,且很快,但到大数据量组就很慢,俺等了 8 分钟,没能出结果,就放弃了。

第 7 楼 @sllone
初测组对,且很快,但到大数据量组就偏慢,0m26.499s,而且其中有问题,错了 4 组。

大数据量测试数据(及结果)
http://upload.programfan.com/upfile/200607101617152.zip

俺的思路和 @iAkiak 一样,个人比较喜欢他的代码,清楚而简明。当然速度的最快的 @nwpuzhl 的代码也比较清晰,以为有两个原因使他那代码的速度很快,在长度很小的情况下冒泡排序速度很不错,另外我那测试数据的单个单词长度偏小,出现次数偏少,主要用于生成测试数据的程序有些小问题导致这样。又看了下 @diycai 的代码,蛮巧妙的思路,利用位标记来统计匹配数。另外因为待查的项偏少所以不进行对应词典的预排(或建堆)在某些情况下(项数长度偏短,项数个数偏少,词典中相同项偏少,靠近尾部的重复长项偏少等),可能会更加快。

宣布此题比赛的冠军是 @nwpuzhl
请 nwpuzhl 负责出下周的第 35 次比赛第 2 题。

回复列表 (共7个回复)

沙发

楼主测我的的时候没遇到运行期错误吗

板凳

[quote]楼主测我的的时候没遇到运行期错误吗[/quote]

没有出现运行时错误,看来我那测试数据的覆盖面不够广。

3 楼

把map改为hash_map, 不过得有stlport才能编译...速度快了一倍

[code]#include <cstdio>
#include <hash_map>
#include <string>
#include <algorithm>

using namespace std;

#pragma warning(disable:4786)

int main()
{
    int n, i;
    char buf[10];
    hash_map<string, int> ct;
    freopen("100000f.txt", "rt", stdin);
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%s", buf);
        string k(buf);
        sort(k.begin(), k.end()); 
        ct[k]++;
    }
    scanf("%*d");
    while(scanf("%s", buf) == 1)
    {
        string k(buf);
        sort(k.begin(), k.end());
        printf("%d\n", ct[k]);
    }
    return 0;
}[/code]

4 楼

哎,终于当上老大了,没想到啊 !

5 楼

那个Programming Pearls上有关于这类似处理方法的效率讨论 -- 其结论就是越是大规模,hash表的处理方法,速度越能得到体现!

然后,是C的实现,比C++的STL快...

6 楼

原来是这样,字符少的时候hash的步骤倒多于排序了:)

7 楼

/*********************************************************************
前阵子一直没写代码 也错过了几次竞赛 怕手生了 又没新竞赛 就翻出这道题练练手  自己已调试过 不知道效率 希望高手有空帮我测测 谢谢:)
同时也实在期待新一期的竞赛哦  怎么一直没动静了哦 郁闷- -
*********************************************************************/
#include <iostream>
#include "string.h"
#include "stdlib.h"
using namespace std;
int fram(const void *p1,const void *p2)
{
    char a1=*(const char *)p1;
    char a2=*(const char *)p2;
    if(a1>a2)
        return 1;
    else return -1;
}
char tmp[10][1000][10];
main()
{
    int result[100];
    int k=0;
    int LG;
    int flag=1;
    char temp[10];
    int jishu[10]={0};
    int num[10][100]={0};
    int lenth;
    int i,j;
    cin>>i;
    for(;i>0;i--)
    {
        cin>>temp;
        lenth=strlen(temp);
        qsort(temp,lenth,sizeof(char),*fram);
        lenth--;
        for(j=0;j<jishu[lenth];j++)
        {
            if(strcmp(tmp[lenth][j],temp)==0)
            {
                num[lenth][j]++;
                flag=0;
                break;
            }
        }
        if(flag)
            strcpy(tmp[lenth][jishu[lenth]++],temp);
        flag=1;
    }
    flag=0;
    cin>>i;
    LG=i;
    for(;i>0;i--)
    {
        cin>>temp;
        lenth=strlen(temp);
        qsort(temp,lenth,sizeof(char),*fram);
        lenth--;
        for(j=0;j<jishu[lenth];j++)
        {
            if(strcmp(tmp[lenth][j],temp)==0)
            {
                flag=1;
                break;
            }
        }
        if(flag)
            result[k++]=num[lenth][j]+1;
        else
            result[k++]=0;
        flag=0;
    }
    for(;i<LG;i++)
        cout<<result[i]<<endl;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册