ACWing 1117 單詞接龍

2021-10-22 05:30:03 字數 1630 閱讀 5507

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲。現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」,每個單詞最多被使用兩次。在兩個單詞相連時,其重合部分合為一部分,例如beastastonish,如果接成一條龍則變為beastonish

我們可以任意選擇重合部分的長度,但其長度必須大於等於1,且嚴格小於兩個串的長度,例如atatide間不能相連。

輸入格式:

輸入的第一行為乙個單獨的整數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,另外相鄰的兩部分...