GH6 2022-08-18 14:29 采纳率: 50%
浏览 17

洛谷p1234a看了

#include
#include
#include
#include
#define maxn 100
using namespace std;
int n;
int ans = 0;
string word[maxn];//字符串数组,用来存储单词
string beginn;//用来存储开头字符
int used[maxn];//这个就是用来记录dfs时候每一个单词被使用了几次的数组

bool check(string s,string m,int k){//重点一,check函数判断接口可行性,k代表接口长度,以下同
int lens = s.length();
for (int i=0;i<k;i++){
if(s[lens-k+i]!=m[i])//我讲过了
return false;
}
return true;
}

void add(string &s,string m,int k){//拼接操作,因为要把m接到s上,所以对于s串不可以传参,因为我们要试图改变这个串
int lenm = m.length();
for (int i=k;i<lenm;i++)
s+=m[i];//C++字符串类型特性操作,支持+=符号直接拼接
}

void dfs(string now){//这只是一个看似平淡无奇的dfs
int x = now.length();
ans = max(ans,x);//每次拼接之后更新一下答案
for (int i=1;i<=n;i++){
if (used[i]>=2)//如果有一个单词用完了,那这个单词就不能选了
continue;
int maxk = word[i].length();
for (int j=1;j<=maxk;j++){//枚举接口长度
if (check(now,word[i],j)){
string temp = now;//重点二,使用字符串副本进行拼接
add(temp,word[i],j);
if (temp==now)//拼完之后如果发现长度没增加,也就是和原串一样,那这次拼接没有意义,剪掉
continue;
used[i]++;
dfs(temp);
used[i]--;//这只是一个看似平淡无奇#include
#include
#include
#include
#define maxn 100
using namespace std;
int n;
int ans = 0;
string word[maxn];//字符串数组,用来存储单词
string beginn;//用来存储开头字符
int used[maxn];//这个就是用来记录dfs时候每一个单词被使用了几次的数组

bool check(string s,string m,int k){//重点一,check函数判断接口可行性,k代表接口长度,以下同
int lens = s.length();
for (int i=0;i<k;i++){
if(s[lens-k+i]!=m[i])//我讲过了
return false;
}
return true;
}

void add(string &s,string m,int k){//拼接操作,因为要把m接到s上,所以对于s串不可以传参,因为我们要试图改变这个串
int lenm = m.length();
for (int i=k;i<lenm;i++)
s+=m[i];//C++字符串类型特性操作,支持+=符号直接拼接
}

void dfs(string now){//这只是一个看似平淡无奇的dfs
int x = now.length();
ans = max(ans,x);//每次拼接之后更新一下答案
for (int i=1;i<=n;i++){
if (used[i]>=2)//如果有一个单词用完了,那这个单词就不能选了
continue;
int maxk = word[i].length();
for (int j=1;j<=maxk;j++){//枚举接口长度
if (check(now,word[i],j)){
string temp = now;//重点二,使用字符串副本进行拼接
add(temp,word[i],j);
if (temp==now)//拼完之后如果发现长度没增加,也就是和原串一样,那这次拼接没有意义,剪掉
continue;
used[i]++;
dfs(temp);
used[i]--;//这只是一个看似平淡无奇的回溯
}
}
}

}

int main(){
cin >> n;
for (int i=1;i<=n;i++)
cin >> word[i];
cin >> beginn;
dfs(beginn);

cout << ans << endl;
return 0;

}的回溯
}
}
}

}

int main(){
cin >> n;
for (int i=1;i<=n;i++)
cin >> word[i];
cin >> beginn;
dfs(beginn);

cout << ans << endl;
return 0;

}

  • 写回答

1条回答 默认 最新

  • 软泡芙 C#领域优质创作者 2022-08-23 10:23
    关注

    注释。。好细

    评论

报告相同问题?

问题事件

  • 创建了问题 8月18日

悬赏问题

  • ¥15 为什么跑这个代码,文件显示不在呀
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?