码迷,mamicode.com
首页 > 其他好文 > 详细

【搜索】单词接龙 luogu-1019

时间:2018-09-16 21:05:47      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:har   题目   long   bool   搜索   end   tin   str   over   

题目描述

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

AC代码

var
  st:array[1..20]of string;
  n,ans,i:longint;
  vis:array[1..20]of longint;
  
function max(n,m:longint):longint;
begin
  if n>m then exit(n) else exit(m);
end;

function min(n,m:longint):longint;
begin
  if n<m then exit(n) else exit(m);
end;

function cover(st1,st2:string):longint;
var
  i,j:longint;
  fg:boolean;
begin
  for i:=1 to min(length(st1),length(st2))-1 do 
    begin
      fg:=true;
      for j:=1 to i do 
        if st1[length(st1)-i+j]<>st2[j] then fg:=false;
      if fg then exit(i);
    end;
  exit(0);
end;

procedure dfs(s:string;len:longint);
var
  i,covernum:longint;
begin
  ans:=max(ans,len);
  for i:=1 to n do 
    begin
      if vis[i]>=2 then continue;
      covernum:=cover(s,st[i]);
      if covernum>0 then 
        begin
          inc(vis[i]);
          dfs(st[i],len+length(st[i])-covernum);
          dec(vis[i]);
        end;
    end;
end;

begin
  fillchar(vis,sizeof(vis),0);
  readln(n);
  for i:=1 to n+1 do readln(st[i]);
  ans:=0;
  dfs(' '+st[n+1],1);
  writeln(ans);
end.

【搜索】单词接龙 luogu-1019

标签:har   题目   long   bool   搜索   end   tin   str   over   

原文地址:https://www.cnblogs.com/Dawn-Star/p/9657111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!