P1019 单词接龙 (DFS&字符串匹配)
题意:给若干单词(最多使用两次)进行单词接龙(前一个单词的后缀与后一个单词的前缀满足重合一部分(小于单词的长度),求最大长度。
思路:写一个匹配前后缀函数,再用DFS进行搜索即可。
#include<bits/stdc++.h>
using namespace std;
string b[25];
int n,ans,vis[25];
int fun(string a,string b){ //单词a后缀与b前缀匹配
int la=a.size(),lb=b.size(),f=1;
for(int i=1;i<min(la,lb);i++,f=1){
for(int j=0;j<i;j++)
if(a[la-i+j]!=b[j]){
f=0;
}
if(f) return i;
}
return 0;
}
void dfs(string a,int la){
//cout<<"a="<<a<<" "<<"la="<<la<<endl;
ans=max(ans,la);
for(int i=0;i<n;i++){
if(vis[i]>=2) continue;
int len=fun(a,b[i]),lb=b[i].size();
if(len){
vis[i]++;
dfs(b[i],la+lb-len);
vis[i]--;
}
}
}
int main(){
cin>>n;
for(int i=0;i<=n;i++) cin>>b[i];
dfs(' '+b[n],1);//保证第一个单词能匹配到
cout<<ans<<endl;
return 0;
}