Codevs P1018 单词接龙

7 篇文章 0 订阅

Codevs 1018 单词接龙


题目描述 Description

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。

输入输出


输入描述 Input Description

输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.


输出描述 Output Description

只需输出以此字母开头的最长的“龙”的长度


样例 Sample


样例输入 Sample Input

5
at
touch
cheat
choose
tact
a


样例输出 Sample Output

23

数据范围及提示 Data Size & Hint
(连成的“龙”为atoucheatactactouchoose)


分析

(⊙o⊙)嗯,该题纯粹的DFS,只要打好标记数组和字符串处理即可完成。至于题目所说的包含关系则完全没有任何用处,因为当一个词被包含时,要么长度不变,要么长度变长,而在深搜过程中不断取最大,所以说就没有必要特意判断是否包含。


代码如下

program  p1018;
var vocabulary:array[1..1000] of string;
    used:array[1..1000] of 0..2;
    i,n,maxn:longint;
    start:char;
    now:string;
function max(a,b:longint):longint;
begin
 if a>b then exit(a);
 exit(b);
end;

procedure dfs;
var i,j,k,l:longint;
    str2,str3:string;
begin
 for i:=1 to n do
  begin
   if used[i]<2
    then
     begin
      str2:='';
      str3:='';
      j:=length(now)+1;
      k:=0;
      l:=j-1;
      while ((str2<>str3) or ((str2='') and (str3=''))) and (j>1) and (k<length(vocabulary[i])) do
       begin
        j:=j-1;
        k:=k+1;
        str2:=now[j]+str2;
        str3:=str3+vocabulary[i,k];
       end;
      if str2=str3
       then
        begin
         used[i]:=used[i]+1;
         now:=copy(now,1,j-1)+vocabulary[i];
         dfs;
         used[i]:=used[i]-1;
         maxn:=max(maxn,length(now));
         now:=copy(now,1,l);
        end;
     end;
  end;
end;

begin
 readln(n);
 for i:=1 to n do
  readln(vocabulary[i]);
 readln(start);
 for i:=1 to n do
  if vocabulary[i,1]=start
   then
    begin
     maxn:=max(maxn,length(vocabulary[i]));
     used[i]:=used[i]+1;
     now:=vocabulary[i];
     dfs;
     used[i]:=used[i]-1;
    end;
 write(maxn);
end.

评测结果

测试通过 Accepted
100%
总耗时: 1 ms
0 / 0 数据通过测试.
运行结果
测试点#41.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#42.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#43.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#44.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#45.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#46.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms


HOLD ON

加油,不要放弃未来的希望

相信未来

相信未来

 作者 食指

当蜘蛛网无情地查封了我的炉台,
当灰烬的余烟叹息着贫困的悲哀,
我依然固执地铺平失望的灰烬,
用美丽的雪花写下:相信未来。


当我的紫葡萄化为深秋的露水,
当我的鲜花依偎在别人的情怀,
我依然固执地用凝霜的枯藤,
在凄凉的大地上写下:相信未来。


我要用手指那涌向天边的排浪,
我要用手撑那托起太阳的大海,
摇曳着曙光那支温暖漂亮的笔杆,
用孩子的笔体写下:相信未来。


我之所以坚定地相信未来,
是我相信未来人们的眼睛——
她有拨开历史风尘的睫毛,
她有看透岁月篇章的瞳孔。


不管人们对于我们腐烂的皮肉,
那些迷途的惆怅,失败的苦痛,
是寄予感动的热泪,深切的同情,
还是给以轻蔑的微笑,辛辣的嘲讽。
我坚信人们对于我们的脊骨,
那无数次地探索、迷途、失败和成功,
一定会给予热情、客观、公正的评定,
是的,我焦急地等待着他们的评定。


朋友,坚定地相信未来吧,
相信不屈不挠的努力,
相信战胜死亡的年轻,
相信未来,热爱生命。

1968年
出自《食指的诗》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值