題目描述
單詞接龍是一個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合爲一部分,例如 beast和astonish,如果接成一條龍則變爲beastonish,另外相鄰的兩部分不能存在包含關係,例如at 和 atide 間不能相連。
輸入
輸入的第一行爲一個單獨的整數n (n<=20)表示單詞數,以下n 行每行有一個單詞,輸入的最後一行爲一個單個字符,表示“龍”開頭的字母。你可以假定以此字母開頭的“龍”一定存在.
輸出
只需輸出以此字母開頭的最長的“龍”的長度
樣例輸入
5 at touch cheat choose tact a
複製
樣例輸出
23
複製
提示
樣例說明
連成的“龍”爲atoucheatactactouchoose
枚舉所有符合條件的龍頭,然後進行深搜
#include<bits/stdc++.h>
using namespace std;
string a[10005];
int n;
int v[100005]={0};
int m=0;
void dfs(string t){
int k=t.size();
//cout<<t<<endl;
m=max(m,k);
for(int i=1;i<=n;i++){
if(v[i]==2) continue;
int len=min(a[i].size(),t.size());
while(--len){
if(t.substr(t.size()-len)==a[i].substr(0,len))
{
v[i]++;
dfs(t.substr(0,t.size()-len)+a[i]);
v[i]--;
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>a[0];
for(int i=1;i<=n;i++){
if(a[0][0]==a[i][0]){
v[i]++;
dfs(a[i]);
v[i]--;
}
}
cout<<m;
}