單詞接龍(vijos1311)

2021-05-31 23:29:41 字數 2498 閱讀 7931

演算法:搜尋

這道題花的時間不少,一言蔽之都是錯在小的細節上了,因此對於這些細節一定要注意!

我們首先可以根據讀入的字串求出任意兩個字串之前的關係,用d[i,j]表示i字串連線j字串後新增加的長度,這裡還要注意會出現自己連線自己的特殊情況。(錯在這了半天的說)

然後就是簡單的dfs了,注意每個字串的使用次數是2,每個開頭是關鍵字母的字串都做一遍搜尋即可。

program vijos1311;

const

maxn=20;

var n,temlen,tot,ans:longint;

s:array [0..maxn] of string;

b:array [0..maxn,0..maxn] of boolean;

d:array [0..maxn,0..maxn] of longint;

len,v,start,vv:array [0..maxn] of longint;

procedure init;

var i,j,k,l:longint;

t:boolean;

x,y:string;

ch:char;

begin

ans:=0;

tot:=0;

readln(n);

for i:=1 to n do

begin

readln(s[i]);

len[i]:=length(s[i]);

v[i]:=2;

end;

vv:=v;

readln(ch);

for i:=1 to n do

begin

if s[i,1]=ch then

begin

inc(tot);

start[tot]:=i;

end;

end;

for i:=1 to n do

begin

for j:=1 to n do

begin

t:=false;

if len[i]>=len[j] then k:=len[j] else k:=len[i];

if s[i]<>s[j] then

begin

for l:=1 to k do

begin

x:=copy(s[i],len[i]-l+1,len[i]);

y:=copy(s[j],1,l);

if x=y then

begin

t:=true;

temlen:=l;

break;

end;

end;

end;

if s[i]=s[j] then

begin

for l:=1 to (len[i] shr 1) do

begin

x:=copy(s[i],1,l);

y:=copy(s[j],len[j]-l+1,len[j]);

if x=y then

begin

t:=true;

temlen:=l;

break;

end;

end;

end;

if t then

begin

b[i,j]:=true;

d[i,j]:=len[j]-temlen;

end;

end;

end;

end;

procedure dfs(st,maxlen:longint);

var i:longint;

begin

if maxlen>ans then ans:=maxlen;

for i:=1 to n do

begin

if (b[st,i]) and (v[i]>0) then

begin

dec(v[i]);

dfs(i,maxlen+d[st,i]);

inc(v[i]);

end;

end;

end;

procedure main;

var i:longint;

begin

for i:=1 to tot do

begin

v:=vv;

v[start[i]]:=1;

dfs(start[i],len[start[i]]);

end;

end;

begin

assign(input,'vj1311.in'); reset(input);

assign(output,'vj1311.out'); rewrite(output);

init;

main;

writeln(ans);

close(input); close(output);

end.

1018 單詞接龍

題目描述 description 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beast...

1220 單詞接龍

題目 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分...

zufeoj 單詞接龍

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存...