回 帖 发 新 帖 刷新版面

主题:关于80次编程比赛,最终代码在底楼,谢谢版主帮测

晚上我再重写代码,把要比较的字符串,开头有重复的字符先缩成一个字符再作比较,谢谢版主,晚上我再贴上来.

回想下线代的内容,对这题很有启发。

如果a中有一个字符比b的首字符大,那b串一定在该位置前插入,或者说,b串插入a的位置之前不能有比b首字符大的字符。。。
按这个思路考虑下去吧,你会发现这题居然是如此简单。
+++++++++++++++++++++++++++++++++++++++++++++++++
[color=FF00FF]代码已经重写过了,字典长度为4的测试文件完全通过,1楼的代码作废,当代码难以修改时,唯一的办法就是重写,请版主帮忙用100000长度的测试文件试试看,谢谢[/color]

回复列表 (共23个回复)

沙发

[color=FF00FF]此楼代码用字典长为4的完全测试,共计49998处错误,此楼代码作废[/color]

#include <stdio.h>
#define MAXLEN 100000

//todo: 在此增加你所需要的函数或者变量或者头文件

void deal(char* a, char* b, char* c)
{
    // todo: 在此补充你的处理代码
    // 参数说明: a和b是输入的字符串,c要保存输出结果
    int i,j[color=FF00FF],k[/color],flag;
    
    flag=0;
    for(j=1;b[j]==b[0];j++);
    if(b[j] && b[j]<b[0])flag=1;

    for(i=0;a[i] && a[i]<=b[0];i++);
    if(a[i]!='\0'){
        if(flag)
            for(;a[i-1]==b[0];i--);
    }else if(flag){
        for(i=0;;i++){
            for(;a[i] && a[i]<b[0];i++);
            if(a[i]=='\0') break;
            for(j=1;b[j] && a[i+j]==b[j];j++);
            if(!b[j] || a[i+j] && a[i+j]<b[j]) continue;
[color=FF00FF]
            if(a[i+j]=='\0')
                if(b[j]>b[0]) i+=j;
                    else
                        for(k=0;b[j];k++,j++){
                            if(b[j]==b[k]) continue;
                            if(b[j]>b[k]) i+=j;
                            break;
                        }
[/color]
            break;
        }
        [color=FF00FF]for(;a[i-1]==b[0];i--);[/color]
    }

    for(j=0;j<i;j++)   c[j]=a[j];
    for(j=0;b[j];j++)  c[i+j]=b[j];
    for(j+=i;a[i];i++) c[j++]=a[i];
    c[j]='\0';
    return;
}

char a[MAXLEN+1], b[MAXLEN+1], c[MAXLEN*2+1];
int main(void)
{
    while (scanf("%s%s", a, b)!=EOF)
    {
        deal(a, b, c);
        puts(c);
    }
    return 0;
}

板凳

12 221这组有错

3 楼

已作修改,谢谢版主的测试,麻烦再测一次,谢谢

4 楼

8282828282 8282828283
这组错了

5 楼

哇~~~你们俩的这份执著~~~太令人感动了~~~~海可枯石可烂~~我们心连着心~~~~

6 楼

我是最近两天才来这论坛转转的,呵呵,第一次参加这种活动,虽然是很老的题了
我明白这些题目为啥这么多人都通不过了,因为大家传上来的代码都没经过完全测试就放上来了,测试权在版主手中啊
我现在在生成这道题所需的测试文件,把10万长度内所有的数字组合配对生成一个完全测试文件,只要通过这个文件就保证不错
受这题困绕的同志们,等我把生成测试文件的代码贴上来,你们就可以自己测试了

7 楼

对不起,我再贴一份到楼下:
#include <stdio.h>
#define MAXLEN 100000

//todo: 在此增加你所需要的函数或者变量或者头文件

void deal(char* a, char* b, char* c)
{
    // todo: 在此补充你的处理代码
    // 参数说明: a和b是输入的字符串,c要保存输出结果
    int i,j,ii,flag,flagmax;
    char *va,*vb;

    flag=0;
    for(j=1;b[j]==b[0];j++);
    if(b[j] && b[j]<b[0])flag=1;

    for(i=ii=flagmax=0;;i++){
        for(;a[i] && a[i]<b[0];i++);
        if(a[i]>b[0] && !flagmax){
            if(flag)
                for(;a[i-1]==b[0];i--);
            flagmax=1;
        }
        va=b;vb=a+ii;
        for(j=0;;j++){
            if(!va[j])va=a+ii-j;
            if(j==i-ii)vb=b-i+ii;
            if(!vb[j])break;
            if(va[j]>vb[j]){ii=i;break;}
            if(va[j]<vb[j])break;
        }
        if(flagmax || a[i]=='\0') break;
    }

    for(j=0;j<ii;j++)   c[j]=a[j];
    for(j=0;b[j];j++)  c[ii+j]=b[j];
    for(j+=ii;a[ii];ii++) c[j++]=a[ii];
    c[j]='\0';

    return;
}

char a[MAXLEN+1], b[MAXLEN+1], c[MAXLEN*2+1];
int main(void)
{
    while (scanf("%s%s", a, b)!=EOF)
    {
        deal(a, b, c);
        puts(c);
    }
    return 0;
}

8 楼

8282828282 8282828283
这组的结果,跟
        memmove(d,a,i);
        memmove(&d[i],b,bLen);
        memmove(&d[i+bLen],&a[i],aLen-i+1);//包括末尾的'\0'
        if(strcmp(d,c)<0)strcpy(c,d);
这人的结果一样:
82828282828282828283
他都能全过,没道理我错了啊

9 楼

Problem ID "[color=Blue]135[/color]"
Submit Time: 2009/3/23-14:14

[color=blue]G++: Compile OK[/color]

Test  1:    [color=blue]Accepted[/color]    Time = 0 ms
Test  2:    [color=blue]Accepted[/color]    Time = 279 ms
Test  3:    [color=red]Time Limit Exceed[/color]
--------------------------------
Problem ID     135
Test Result    [color=red]Time Limit Exceed[/color]
Time Limit     1000 ms
Total Memory   252 Kb / 2000 Kb
Code Length    1047 Bytes

10 楼

只能通过两关啊,头疼,我再考虑是否可以把序列看成一组离散信号,通过波形来判断寻找插入点

我来回复

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