【搜索】单词接龙 luogu-1019

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 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.

猜你喜欢

转载自www.cnblogs.com/Dawn-Star/p/9657111.html
今日推荐