單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲。現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」,每個單詞最多被使用兩次。在兩個單詞相連時,其重合部分合為一部分,例如beast
和astonish
,如果接成一條龍則變為beastonish
。
我們可以任意選擇重合部分的長度,但其長度必須大於等於1,且嚴格小於兩個串的長度,例如at
和atide
間不能相連。
輸入格式:
輸入的第一行為乙個單獨的整數n
nn表示單詞數,以下n
nn行每行有乙個單詞(只含有大寫或小寫字母,長度不超過20
2020
),輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在。
輸出格式:
只需輸出以此字母開頭的最長的「龍」的長度。
資料範圍:
n ≤20
n≤20
n≤20
兩個單詞s
ss和t
tt,如果t
tt能接在s
ss的後面,那麼一定是t
tt的某個字尾等於t
tt的某個字首,並且這個相等的部分的長度不能等於min
\min\
min。為了使得接龍的長度更加長,我們肯定要找到最短的那個前字尾(例如s = "abcbc"
,而t = "bcbcd"
,那麼我們肯定要兩個拼接為"abcbcbcd"
而不是"abcbcd"
,前者只利用了重合部分"bc"
而後者用了"bcbc"
)。我們可以先預處理一下每兩個字串滿足上述條件的最短前字尾長度,然後開始列舉以」龍「開始的字串,接著dfs暴搜。**如下:
#include
using
namespace std;
const
int n =21;
int n;
string word[n]
;// g[i][j]存word[i]和word[j]相等的最短前字尾長度(word[i]的字尾和word[j]的字首),
// 如果不存在則賦值為0
int g[n]
[n];
// 存word[i]被用了多少次
int used[n]
;// 存全域性答案
int res;
// s是當前接龍的長度,cur存當前最新接到龍後面的單詞下標
void
dfs(string s,
int cur)
intmain()
}for
(int i =
0; i < n; i++)if
(word[i][0
]== st)
dfs(word[i]
, i)
; cout << res << endl;
return0;
}
時間複雜度與具體是怎樣的輸入有關,可以認為是指數級(或以上),空間複雜度o(n
2)
o(n^2)
o(n2)。
AcWing 1117 單詞接龍(DFS順序)
原題鏈結 有一組單詞,如果兩個單詞之間存在重疊部分 不包括包含關係,即at和attch 則可以拼湊起來,問在這一組單詞中,最長可以拼湊成的長度。n 20 n 20 n 20 5 attouch cheat choose tact a23 include using namespace std con...
1018 單詞接龍
題目描述 description 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beast...
1220 單詞接龍
題目 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分...