題目描述
單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」(每個單詞都最多在「龍」中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 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...