單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」(每個單詞都最多在「龍」**現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beastbeast和astonishastonish,如果接成一條龍則變為beastonishbeastonish,另外相鄰的兩部分不能存在包含關係,例如atat 和 atideatide 間不能相連。
輸入格式:
輸入的第一行為乙個單獨的整數nn (n \le 20n≤20)表示單詞數,以下nn 行每行有乙個單詞,輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在.
輸出格式:
只需輸出以此字母開頭的最長的「龍」的長度
輸入樣例#1:複製
5輸出樣例#1:複製attouch
cheat
choose
tact
a
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,如果接成一條...