單詞接龍 洛谷 1019

2021-07-26 09:19:47 字數 1550 閱讀 1436

題目描述

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

輸入輸出格式

輸入格式:

輸入的第一行為乙個單獨的整數n (n<=20)表示單詞數,以下n 行每行有乙個單詞,輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在.

輸出格式:

只需輸出以此字母開頭的最長的「龍」的長度

輸入輸出樣例

輸入樣例#1:5at

touch

cheat

choose

tact

a輸出樣例#1:

23 (連成的「龍」為atoucheatactactouchoose)

題解:這題先用暴力列舉法,然後如果單詞能連線的話就深度搜尋。

var a:array[0..20] of

string;

b,c:array[0..20] of shortint;

l,n:shortint;

s:string;

ss,max:integer;

procedure

link

(head:string);

var k,j,i:byte; s1,s2:string;

begin

for i:=1

to n do

if c[i]<2

then

begin

s:=a[i];

if length(head)>=b[i] then k:=b[i]-1

else k:=length(head);

s1:=''; s2:='';

for j:=1

to k do

begin

s1:=head[length(head)+1-j]+s1;

s2:=s2+s[j];

if s1=s2 then

begin

ss:=ss+b[i]-j; if ss>max then max:=ss;

inc(c[i]);

link(a[i]);

dec(c[i]);

ss:=ss+j-b[i];

end;

end;

end;

end;

begin

readln(n);max:=0;

for l:=1

to n do

begin

readln(s);

a[l]:=s; b[l]:=length(s); c[l]:=0;

end;

readln(s); ss:=length(s);

link(s);

writeln(max);

end.

洛谷 1019 單詞接龍

題解 入門搜尋題。先n方列舉每對單詞,計算他們接龍可以讓長度延長多少,可以延長的在鏈式前向星中加邊。搜尋的時候按照邊表逐個擴充套件就好了。include include include define ll long long define rg register define n 1010 usin...

洛谷p1019 單詞接龍

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

洛谷p1019單詞接龍

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