主题:关于80次编程比赛,最终代码在底楼,谢谢版主帮测
Hawkxp [专家分:350] 发布于 2009-03-20 14:37:00
晚上我再重写代码,把要比较的字符串,开头有重复的字符先缩成一个字符再作比较,谢谢版主,晚上我再贴上来.
回想下线代的内容,对这题很有启发。
如果a中有一个字符比b的首字符大,那b串一定在该位置前插入,或者说,b串插入a的位置之前不能有比b首字符大的字符。。。
按这个思路考虑下去吧,你会发现这题居然是如此简单。
+++++++++++++++++++++++++++++++++++++++++++++++++
[color=FF00FF]代码已经重写过了,字典长度为4的测试文件完全通过,1楼的代码作废,当代码难以修改时,唯一的办法就是重写,请版主帮忙用100000长度的测试文件试试看,谢谢[/color]
最后更新于:2009-04-21 10:08:00
回复列表 (共23个回复)
沙发
Hawkxp [专家分:350] 发布于 2009-03-20 21:30:00
[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;
}
板凳
雨中飞燕 [专家分:18980] 发布于 2009-03-22 07:03:00
12 221这组有错
3 楼
Hawkxp [专家分:350] 发布于 2009-03-22 10:54:00
已作修改,谢谢版主的测试,麻烦再测一次,谢谢
4 楼
雨中飞燕 [专家分:18980] 发布于 2009-03-22 12:24:00
8282828282 8282828283
这组错了
5 楼
小小C [专家分:4570] 发布于 2009-03-22 13:05:00
哇~~~你们俩的这份执著~~~太令人感动了~~~~海可枯石可烂~~我们心连着心~~~~
6 楼
Hawkxp [专家分:350] 发布于 2009-03-22 14:11:00
我是最近两天才来这论坛转转的,呵呵,第一次参加这种活动,虽然是很老的题了
我明白这些题目为啥这么多人都通不过了,因为大家传上来的代码都没经过完全测试就放上来了,测试权在版主手中啊
我现在在生成这道题所需的测试文件,把10万长度内所有的数字组合配对生成一个完全测试文件,只要通过这个文件就保证不错
受这题困绕的同志们,等我把生成测试文件的代码贴上来,你们就可以自己测试了
7 楼
Hawkxp [专家分:350] 发布于 2009-03-23 14:06:00
对不起,我再贴一份到楼下:
#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 楼
Hawkxp [专家分:350] 发布于 2009-03-23 14:08:00
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 楼
雨中飞燕 [专家分:18980] 发布于 2009-03-23 14:10:00
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 楼
Hawkxp [专家分:350] 发布于 2009-03-23 17:58:00
只能通过两关啊,头疼,我再考虑是否可以把序列看成一组离散信号,通过波形来判断寻找插入点
我来回复