洛谷 P1019 單詞接龍
阿新 • • 發佈:2019-01-28
單詞接龍是一個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beastbeast 和 astonishastonish ,如果接成一條龍則變為 beastonishbeastonish ,另外相鄰的兩部分不能存在包含關係,例如 atat 和 atideatide 間不能相連。
輸入輸出格式
輸入格式:
輸入的第一行為一個單獨的整數 nn ( n \le 20n≤20 )表示單詞數,以下 nn 行每行有一個單詞,輸入的最後一行為一個單個字元,表示“龍”開頭的字母。你可以假定以此字母開頭的“龍”一定存在.
輸出格式:
只需輸出以此字母開頭的最長的“龍”的長度
輸入輸出樣例
輸入樣例#1: 複製
5 at touch cheat choose tact a
輸出樣例#1: 複製
23
說明
(連成的“龍”為atoucheatactactouchoose)
NOIp2000提高組第三題
#include <cstring> #include <math.h> #include <vector> #include <queue> #include <cstdio> #include <iostream> #include <cstring> using namespace std; int n,vis[70],maxn; char a[71][9999]; char c; void dfs(int x,int len)//x代表字串序號,len代表這個字串的長度 { maxn=max(len,maxn); for(int i=1;a[x][i];i++) for(int j=1;j<=n;j++) if(vis[j]<2) { int t=1;int k=0; for(;a[x][i+k];k++) if(a[x][i+k]!=a[j][k]) { t=0; break; } if(t) { vis[j]+=1; dfs(j,len+strlen(a[j])-k); vis[j]-=1; } } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) cin>>a[i]; cin>>c; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(a[i][0]==c) vis[i]+=1,dfs(i,strlen(a[i])); //vis[i]-=1; } cout<<maxn; return 0; }