【题解】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;
}
后记
云落最近身体不适,更的有点慢了,望大家见谅!
完结撒花!