信息学奥赛一本通(1220:单词接龙)
?
1220:單詞接龍
時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 5368 ??? 通過數: 3159
【題目描述】
單詞接龍是一個與我們經常玩的成語接龍相類似的游戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關系,例如at和atide間不能相連。
【輸入】
輸入的第一行為一個單獨的整數n(n<=20)表示單詞數,以下n行每行有一個單詞(只含有大寫或小寫字母,長度不超過20),輸入的最后一行為一個單個字符,表示“龍”開頭的字母。你可以假定以此字母開頭的“龍”一定存在。
【輸出】
只需輸出以此字母開頭的最長的“龍”的長度。
【輸入樣例】
5 at touch cheat choose tact a【輸出樣例】
23【分析】
? ? ? ? 以樣例數據為例,構造兩兩單詞接龍重疊字符矩陣,再根據該矩陣構造遞歸解答樹,如下圖
? ? ? ? at 可以和 touch 或 tact 相連,長度分為6 或 5,而 touch 則可以和 cheat 或 choose 進行相連,長度為9 或 10,...
? ? ? ? 以此類推,最長的龍為:atoucheatactactouchoose。注意:每個單詞都最多在“龍”中出現兩次。
? ? ? ? 這道題用C++代碼要簡單一些,有關字符串的代碼,用C語言非常困難。
感謝題解:https://www.cnblogs.com/-xiangyang/p/9220236.html
【參考代碼】
#include<bits/stdc++.h> using namespace std; const int MAXN=50; string str[MAXN]; int n,used[MAXN]; int ans=0; int check(string a,string b)//查找想同的部分長度 {int la=a.size(),lb=b.size();int l=min(la,lb);for(int i=1;i<l;i++) {int flag = 1;for (int j = 0; j < i; j++){if(a[la-i+j]!=b[j])flag=0;}if(flag) return i;}return 0; } void dfs(string s,int len) {ans=max(ans,len);for(int i=0;i<n;i++){if(used[i]>=2) continue;int c=check(s,str[i]);if(c>0) {used[i]++;dfs(str[i],len+str[i].size()-c);used[i]--;}}} int main() {cin>>n;getchar();for(int i=0;i<n;i++) {cin>>str[i];getchar();used[i]=0;}string s;cin>>s;dfs(' '+s,1);cout<<ans<<endl;return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1220
?
總結
以上是生活随笔為你收集整理的信息学奥赛一本通(1220:单词接龙)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1197:山区建小学)
- 下一篇: 数论 —— 概述