單詞接龍

題目描述

  單詞接龍是一個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合爲一部分,例如 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;
	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章