讨论 / 为什么错了(悬赏)
jerryR1 2009-08-01 09:35:00
点我顶贴 收藏 删除
大牛们看看,哪里错了?

var i,j,b,max,n:longint;

s:array[0..10000] of string;

w:array[0..10000] of longint;

begin

readln(n);

for i:=1 to n do readln(s[i]);

for i:=1 to n do

begin

w[i]:=1;

for j:=1 to i-1 do

if (pos(s[j],s[i])=1)and(w[j]+1>w[i]) then w[i]:=w[j]+1;

end;

max:=0;

for i:=1 to n do if w[i]>max then max:=w[i];

write(max);

end.

运行结果如下:

状态: Unaccepted

测评机: Xeost[5]

得分: 50分

提交日期: 2009-7-27 11:21:00

有效耗时: 938毫秒

测试结果1: 通过本测试点|有效耗时172ms

测试结果2: 通过本测试点|有效耗时172ms

测试结果3: 通过本测试点|有效耗时172ms

测试结果4: 通过本测试点|有效耗时219ms

测试结果5: 通过本测试点|有效耗时203ms

测试结果6: 选手程序运行超过时限

测试结果7: 测试结果错误.错误结果为:15

正确结果应为:22

测试结果8: 选手程序运行超过时限

测试结果9: 测试结果错误.错误结果为:15

正确结果应为:23

测试结果10: 选手程序运行超过时限

在此先谢谢大牛们的指导

#1 hades@2009-07-27 14:19:00
回复 删除
把数组改大点试试撒。改成100000的
#2 jerryR1@2009-07-28 15:12:00
回复 删除
结果还是一样的.集思广益,紧急呼叫大牛们!!
#3 jerryR1@2009-07-29 15:16:00
回复 删除
#4 jerryR1@2009-07-29 18:07:00
回复 删除
呼叫大牛们!!!
#5 jerryR1@2009-07-31 14:46:00
回复 删除
#6 hades@2009-08-01 09:35:00
回复 删除
题目叙述中有一句:给出的单词按字典序排列。

那么后面的单词>前面的单词,换句话说,对于I,J,K,有

I<J<K,如果S[J]是S[K]的一个子串,那么假设S[I]也是S[K] 的一个子串,那么S[I]也一定是S[J]的一个子串,所以只需倒序查找第一个属于S[K]的子串就够了,然后就BREAK,下面的是由你的程序改过来的,ac的,看看哪里不一样你就明白了。

var i,j,b,max,n:longint;

s:array[0..50000] of string;

w:array[0..50000] of longint;

begin

readln(n);

for i:=1 to n do readln(s[i]);

for i:=1 to n do

begin

w[i]:=1;

for j:=i-1 downto 1 do

if (pos(s[j],s[i])=1)and(w[j]+1>w[i]) then begin w[i]:=w[j]+1;

break;end;

end;

max:=0;

for i:=1 to n do if w[i]>max then max:=w[i];

write(max);

end.

查看更多回复
提交回复