SDNU 1022.成語接龍
Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 71 Accepted Submission(s): 35
Description
成語接龍的的遊戲大家都玩過,現在咱們換換玩法,玩個英文版的“成語接龍”,規則是已知n個單詞,給出龍頭字母,要求以這個字母開頭的最長的“龍”(每個單詞最多在“龍”中出現2次),在兩個單詞相連時,起重合的部分合爲一部分,例如best和stabber,接成一條龍則變爲bestabber,另外相鄰的兩部分不能存在包含關係,例如at 和 atside 間不能相連。
Input
輸入的第一行爲一個整數n (n<=20),表示單詞個數,以下n 行每行有一個單詞(長度不超過50),輸入的最後一行爲一個單個字符,表示“龍”開頭的字母。此字母開頭的“龍”一定存在.
Output
只需輸出以此字母開頭的最長的“龍”的長度
Sample Input
5
at
touch
cheat
choose
tact
a
Sample Output
23
典型的dfs題,還有對於字符串的處理,在碰到前綴後綴判斷的時候,substr函數真的很好用,誰用誰知道。
值得注意的是對於前後綴的判斷要從大向小判斷。
仔細做還是很簡單的,附上Ac代碼:
#include<bits/stdc++.h>
using namespace std;
int maxn=0,n;
string a[30];
int pd[30]= {0};
void dfs(string b,int sum)
{
maxn=max(maxn,sum);
//cout<<sum<<' '<<b<<endl;
for(int i=0; i<n; i++)
{
if(pd[i]<2)
{
int lena=a[i].length();
int lenb=b.length();
int minx=min(lena,lenb);
for(int j=minx-1; j>=1; j--)
{
if(b.substr(lenb-j,lenb)==a[i].substr(0,j))
{
int x=b.substr(lenb-j,lenb-1).length();
pd[i]++;
dfs(a[i],sum+lena-x);
pd[i]--;
}
}
}
}
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
char s;
cin>>s;
for(int i=0; i<n; i++)
{
if(a[i][0]==s)
{
memset(pd,0,sizeof(pd));
pd[i]++;
dfs(a[i],a[i].length());
}
}
cout<<maxn<<endl;
}