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: 选手程序运行超过时限
在此先谢谢大牛们的指导
那么后面的单词>前面的单词,换句话说,对于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.