落谷試煉場:P1019 單詞接龍
阿新 • • 發佈:2018-12-21
題目連結:https://www.luogu.org/problemnew/show/P1019 思路:用dfs暴力搜尋每一種“接龍”情況,此處注意每個單詞只能在接龍中出現兩次,同時為了保證接龍最長,每兩個單詞如果有多種合併方式,重合部分應最短 c++程式碼:
#include <iostream> #include <cstdio> #include <vector> #include <cstring> using namespace std; const int maxn=60; struct node { string s; int p; node(string a,int t):s(a),p(t){} node(){} }; vector <node> v; int vis[maxn]; string s[maxn]; int ans; int cnt; int n; string merge(string a,string b) { int i; int ti=0; string res=""; int len=min(a.length(),b.length()); for( i=1;i<=len;i++) { if(a.substr(a.length()-i,i)==b.substr(0,i)&&i<len) { { ti=i; break; } } } if(!ti)return ""; else { res=a.substr(0,a.length()-ti)+b; return res; } } void dfs(string t,int p,int& num) { int len=t.length(); num=max(len,num); for(int i=0;i<n;i++) { if(vis[i]>=2)continue; string q=merge(t,s[i]); if(q=="")continue; else { vis[i]++; dfs(q,i,num); vis[i]--; } } } int main() { scanf("%d",&n); for(int i=0;i<n;i++ ) { cin >> s[i]; } char c; cin >> c; for(int i=0;i<n;i++) { if(s[i][0]==c)v.push_back(node(s[i],i)); } memset(vis,0,sizeof(vis)); for(int i=0;i<(int)v.size();i++) { cnt=0; vis[v[i].p]=1; dfs(v[i].s,v[i].p,cnt); if(cnt>ans)ans=cnt; vis[v[i].p]=0; } cout << ans <<endl; return 0; }