window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

ABC268D解题报告

题意

题面传送门

分析

题目一眼看出是 dfs 暴搜的题,只需要先全排列一下每一个字符串的顺序,再根据字符串已有的长度去再 dfs 一遍中间插入 _ 的数量。

对于不能重复,易得通过一个 map 去存储已经出现的 string,最后在 dfs 找到答案的时候看一下 map 中有没有出现即可。

注意:长度要满足 3X16

代码

#include<bits/stdc++.h> using namespace std; int n, m; int a[10], vis[10]; string s[10], t[100005]; vector<string> v; map<string, int> mp; void dfs1(int x, int sum){ if (sum < 0) return ; if (x == n){ if(16 - sum < 3) return; string ans = v[0]; for (int i = 1; i < n; i++){ for (int j = 1; j <= a[i]; j++) ans += "_"; ans += v[i]; } if (mp[ans] == 0) cout << ans, exit(0); return ; } for (int i = 1; i <= sum; i++){ a[x] = i; dfs1(x + 1, sum - i); } } void dfs(int x, int sum){ if (x == n + 1){ memset(a, 0, sizeof(a)); dfs1(1, 16 - sum); return ; } for (int i = 1; i <= n; i++){ if (vis[i] == 0){ v.push_back(s[i]), vis[i] = 1; dfs(x + 1, sum + s[i].size()); vis[i] = 0, v.pop_back(); } } } int main(){ cin >> n >> m; for (int i = 1; i <= n; i++) cin >> s[i]; for (int i = 1; i <= m; i++){ cin >> t[i]; mp[t[i]] = 1; } dfs(1, 0); cout << -1; return 0; }

__EOF__

本文作者ccf-ioi
本文链接https://www.cnblogs.com/ccf-ioi/p/17971623.html
关于博主:I AK IOI
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   CCF_IOI  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示