【题解】P1019 单词接龙

题面

题目传送门

前言

搜索与字符串(超级水……)

正文

递归中的 DFS 是相当好想,不断暴力拓展,不断回溯……

找最大值也是显然的

重点在于如何判断两个字符串能不能构成合法的首尾匹配

其实枚举每一位匹配就可以力!

注意不可以存在包含关系

还有一个坑点,每个单词可以出现不超过两次

云落无话可说,实在有疑问就阅读程序吧……

代码

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1e5+10;
int n;
string s[maxn];
char ch;
int len[maxn],vis[maxn],tot,res,ans;
inline int find(int x,int y){
	int lx=len[x],ly=len[y];
	for(int i=lx-1;i>=1;i--){
		if(s[x][i]==s[y][0]){
			int k=0;
			for(int j=i+1;j<=lx-1;j++){
				k++;
				if(s[x][j]!=s[y][k]){
					return 0;
				}
			}
			return ly-k-1;
		}
	}
	return 0;
}
inline void dfs(int x){
	for(int i=1;i<=n;i++){
		if(vis[i]<2&&find(x,i)){
			vis[i]++;
			tot+=find(x,i);
			dfs(i);
			vis[i]--;
			tot-=find(x,i);
		}
	}
	res=max(res,tot);
	return;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		len[i]=s[i].length();
	}
	cin>>ch;
	for(int i=1;i<=n;i++){
		if(s[i][0]==ch){
			tot=len[i];
			vis[i]++;
			dfs(i);
			vis[i]--;
			ans=max(ans,res);
		}
	}
	cout<<ans<<endl;
    return 0;
}

后记

云落最近身体不适,更的有点慢了,望大家见谅!

完结撒花!

posted @ 2024-12-23 20:10  sunxuhetai  阅读(8)  评论(0)    收藏  举报