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;
}