洛谷 P1019 單詞接龍

2021-09-19 15:25:14 字數 1521 閱讀 8372

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

輸入格式:

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

輸出格式:

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

輸入樣例#1:複製

5

attouch

cheat

choose

tact

a

輸出樣例#1:複製

23
(連成的「龍」為atoucheatactactouchoose)

noip2000提高組第三題

#include#include#include#includeusing namespace std;

int n;//單詞數

string tr[30];//儲存字串

int yc[30][30];//兩個字母的最小重疊部分

int vis[30];//判斷單詞使用頻率.

int mt(int x, int y) //mt函式,返回x單詞後連線乙個y單詞的最小重疊部分

}if(pp == true) //如果說當前以k為開頭的前乙個單詞字尾 ,是後面單詞的字首,就馬上返回重疊部分。(tr[x].size()-k是找出來的規律)

ky = 0;

pp = true; //不行就繼續

}return 0;

}//可能這裡有點難理解。可以手動模擬一下

char ch;//開頭字母

int ans = -1; //答案

int an = 0; //每次搜到的當前最長串

void dfs(int p) //p為尾部單詞編號(p的字尾就是「龍」的字尾,因為p已經連線到」龍「後面了)

if(jx == false) //jx==false說明不能再找到任何乙個單詞可以相連了

return;

}int main()

}//預處理yc陣列。yc[i][j]就表示,i單詞後連線乙個j單詞的最小重疊部分

//比如 i表示at,j表示att. yc[i][j]就為2 但是yc[j][i]就為0.

//預處理是乙個關鍵

for(int i = 1; i <= n; i++) //從頭到尾看一下有沒有以指定開頭字母為開頭的單詞

}printf("%d", ans);

return 0;

}

洛谷p1019 單詞接龍

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

洛谷p1019單詞接龍

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

洛谷 P1019 單詞接龍

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