题目:
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
代码:
const
maxn=100;
var
a:array [1..maxn] of string;
b:array [1..maxn] of longint;
n,temp,ans:longint;
st:string;
procedure init;
var
i:longint;
begin
readln(n);
for i:=1 to n do
readln(a[i]);
readln(st);
temp:=1;
end;
function min(a,b:longint):longint;
begin
if a<b then
exit(a)
else
exit(b);
end;
procedure dfs(s:string);
var
i,j,k:longint;
begin
for i:=1 to n do
begin
k:=0;
if b[i]<2 then
begin
k:=min(length(a[i]),length(s));
for j:=1 to k do
begin
if copy(a[i],1,j)=copy(s,length(s)-j+1,j) then
begin
temp:=temp+length(a[i])-j;
if temp>ans then
ans:=temp;
inc(b[i]);
dfs(a[i]);
temp:=temp-length(a[i])+j;
dec(b[i]);
end;
end;
end;
end;
end;
begin
init;
dfs(st);
writeln(ans);
end.