NamoCamp 每日一题 namonamo 折半搜索
|–>传送门<–|
题目大意
给定一个长度是偶数,仅有小写字母构成的字符串,判断是否能被分成两个完全相同的子序列。(字符串长度 1 ≤ ∣ s ∣ ≤ 40 1 \leq |s| \leq 40 1≤∣s∣≤40)。
题解
考虑暴力枚举,发现需要搜满 2 40 2^{40} 240,复杂度过大。同时观察到数据范围 40 40 40,可以考虑折半搜索的方式进行匹配:
我们首先将字符串分为两半 s [ 0 , m i d ] s[0, mid] s[0,mid]和 s [ m i d , n ] s[mid, n] s[mid,n],然后分别枚举前半段和后半段可能存在的分配方案(可以表示为字符串 a a a和 b b b),这样枚举的复杂度降到了 2 20 2^{20} 220。
然后考虑如何合并前后区间的信息:我们可以发现,最后合法的答案一定呈现这样的形状:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayJRVXfr-1648802024418)(/upload/2022/03/image-18b9b14991214494ab8d82ec2180c3eb.png)]
其中 S L _ a , b SL\_a,b SL_a,b来自左半区间的搜索结果, S R _ a , b SR\_a,b SR_a,b来自右半区间的搜索结果。对应组合为答案。
我们发现 S L _ a , b SL\_a,b SL_a,b具有相同的前缀, S R _ a , b SR\_a,b SR_a,b具有相同的后缀,而当去除相同前缀后缀后,我们发现问题变为在左右两段字符串中查找 ( S L _ b − S L _ a ) = = ( S R _ a − S R _ b ) (SL\_b - SL\_a) == (SR\_a - SR\_b) (SL_b−SL_a)==(SR_a−SR_b)(假设长度按图中所描述)。于是我们在前半段的搜索中边搜边删前缀加入集合,在有半段的搜索中边删后缀边检查集合中是否有相等的元素即可。
#include <bits/stdc++.h>std::set<std::string> smp;
std::string s;
bool flag;void dfs1(int st, int ed, std::string & a, std::string & b){if(st > ed){int slen = std::min(a.size(), b.size()); for(int i = 0; i < slen; i++)if(a[i] != b[i]) return;if(a.size() == b.size()) smp.insert("");else if(a.size() > b.size()) smp.insert(a.substr(b.size()));else if(a.size() < b.size()) smp.insert(b.substr(a.size()));return;}a += s[st]; // b += '';dfs1(st + 1, ed, a, b);a.pop_back();b += s[st]; // a += '';dfs1(st + 1, ed, a, b);b.pop_back();
}void dfs2(int st, int ed, std::string & a, std::string & b){if(flag) return;if(st > ed){std::string aa = a, bb = b;std::reverse(aa.begin(), aa.end());std::reverse(bb.begin(), bb.end());int slen = std::min(aa.size(), bb.size());for(int i = 0; i < slen; i++)if(aa[i] != bb[i]) return;std::string aft;if(aa.size() == bb.size()) aft = "";else if(aa.size() > bb.size()) aft = aa.substr(bb.size());else if(aa.size() < bb.size()) aft = bb.substr(aa.size());reverse(aft.begin(), aft.end());if(smp.count(aft)) flag = true;return;}a += s[st];dfs2(st + 1, ed, a, b);a.pop_back();b += s[st];dfs2(st + 1, ed, a, b);b.pop_back();
}inline void solve(){smp.clear(); flag = false;std::cin >> s; s = '@' + s;int slen = s.size() - 1;std::string a, b;dfs1(1, slen >> 1, a, b);dfs2((slen >> 1) + 1, slen, a, b);if(flag) std::cout << "possible\n";else std::cout << "impossible\n";
}signed main(){int t = 0; std::cin >> t;while(t--) solve();return 0;
}
NamoCamp 每日一题 namonamo 折半搜索相关推荐
- 每日刷题总结——广度优先搜索 / 深度优先搜索
目录 286. 墙与门 417. 太平洋大西洋水流问题 1469. 寻找所有的独生节点 582. 杀掉进程 863. 二叉树中所有距离为 K 的结点 752. 打开转盘锁 1319. 连通网络的操作次 ...
- 每日一题:leetcode81.搜索旋转排序数组Ⅱ
题目描述 题目分析 不含重复元素的题解(leetcode33) 这道题也是我们算法课的一道编程题,写完以后发现当时的思路和现在没有什么变化,果然是自己啊.我的想法是先判断区间整体是升序的还是旋转的,如 ...
- 每日一题:leetcode74.搜索二维矩阵
题目描述 题目分析 感觉这是一个放错标签的简单题.题目非常简单,思路应该很明确是二分,我很快写了一个(虽然不小心把!=打成==调试了一会). class Solution {public:bool s ...
- Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)
思路:利用vector变长特性,将前面旋转的部分移到后面,然后二分查找,O(logn)复杂度 int search(vector<int> &nums, int target) { ...
- NamoCamp 每日一题 体育节 区间DP
|–>题目传送门<–| 题目描述 学生会正在为体育节的接力赛做准备.学生会由 n个成员组成,他们将在比赛中一个一个地跑,第 i i i 个人的速度是 s i si si,第 i次接力会产生 ...
- 【解题报告】Leecode 700. 二叉搜索树中的搜索——Leecode每日一题
今天是坚持每日一题打卡的第二十四天 题目链接:https://leetcode-cn.com/problems/search-in-a-binary-search-tree/ 题解汇总:https:/ ...
- 西山居3.22笔试第一题(折半搜索)
题意: 给出一个的表格,每个格子上都有一个数字.要求从左上角(1,1)出发,只能向下或向右走,走到右下角(m,n)视为结束.问有多少种走法能使得走过路径的总异或值等于. 输入: 第一行,三个数字,,, ...
- [luogu4799 CEOI2015 Day2] 世界冰球锦标赛(折半搜索)
传送门 Solution 折半搜索裸题,注意\(long long\) Code #include <cmath> #include <cstdio> #include < ...
- 【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】
题意:有好坏两种点共 nnn 个,每个好点有权值,把这 nnn 个点连成一棵树,一个好点为有用的当且仅当它至少与一个好点相邻,求所有有用的点的权值和不超过 limlimlim 的方案数. n≤40n\ ...
最新文章
- signature=a8a3e788013f73439051c7287d7f5f0b,来用百度密语吧!!!
- 单机部署zookeeper、kafka
- JavaSE(十九)——equals() 和 == 的区别
- OpenGL HDR渲染
- hadoop3.1.2 配置 3台 完全分布式
- 什么是 “马太效应” ?
- leetcode —— 75. 颜色分类
- 12306 java_My12306-1.0 一个用java web写的仿12306火车订票系统 - 下载 - 搜珍网
- Timeline的Clip编辑模式总结
- 计算机显示器一半有阴影,电脑显示器有阴影的解决方法,希望你们喜欢!
- 亚马逊的人工智能Alexa竟然独自大笑 笑声很吓人(附视频)
- sim卡中电话本(ADN)的简要格式
- 手机评论文本挖掘与数据分析(Python)
- Android 商品详情页
- R语言——Error in plot.window(...) : ‘xlim‘值不能是无限的
- 美团笔试题:股票交易日
- F429的RTC当做stop模式下的唤醒源(FreeRTOS)
- 一阶电路中的时间常数_一阶RC电路的时间常数为 ;一阶RL电路的时间常数为
- 现象类话题和策论32133框架
- 大转盘抽奖活动免费创建