|–>传送门<–|

题目大意

给定一个长度是偶数,仅有小写字母构成的字符串,判断是否能被分成两个完全相同的子序列。(字符串长度 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 折半搜索相关推荐

  1. 每日刷题总结——广度优先搜索 / 深度优先搜索

    目录 286. 墙与门 417. 太平洋大西洋水流问题 1469. 寻找所有的独生节点 582. 杀掉进程 863. 二叉树中所有距离为 K 的结点 752. 打开转盘锁 1319. 连通网络的操作次 ...

  2. 每日一题:leetcode81.搜索旋转排序数组Ⅱ

    题目描述 题目分析 不含重复元素的题解(leetcode33) 这道题也是我们算法课的一道编程题,写完以后发现当时的思路和现在没有什么变化,果然是自己啊.我的想法是先判断区间整体是升序的还是旋转的,如 ...

  3. 每日一题:leetcode74.搜索二维矩阵

    题目描述 题目分析 感觉这是一个放错标签的简单题.题目非常简单,思路应该很明确是二分,我很快写了一个(虽然不小心把!=打成==调试了一会). class Solution {public:bool s ...

  4. Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)

    思路:利用vector变长特性,将前面旋转的部分移到后面,然后二分查找,O(logn)复杂度 int search(vector<int> &nums, int target) { ...

  5. NamoCamp 每日一题 体育节 区间DP

    |–>题目传送门<–| 题目描述 学生会正在为体育节的接力赛做准备.学生会由 n个成员组成,他们将在比赛中一个一个地跑,第 i i i 个人的速度是 s i si si,第 i次接力会产生 ...

  6. 【解题报告】Leecode 700. 二叉搜索树中的搜索——Leecode每日一题

    今天是坚持每日一题打卡的第二十四天 题目链接:https://leetcode-cn.com/problems/search-in-a-binary-search-tree/ 题解汇总:https:/ ...

  7. 西山居3.22笔试第一题(折半搜索)

    题意: 给出一个的表格,每个格子上都有一个数字.要求从左上角(1,1)出发,只能向下或向右走,走到右下角(m,n)视为结束.问有多少种走法能使得走过路径的总异或值等于. 输入: 第一行,三个数字,,, ...

  8. [luogu4799 CEOI2015 Day2] 世界冰球锦标赛(折半搜索)

    传送门 Solution 折半搜索裸题,注意\(long long\) Code #include <cmath> #include <cstdio> #include < ...

  9. 【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】

    题意:有好坏两种点共 nnn 个,每个好点有权值,把这 nnn 个点连成一棵树,一个好点为有用的当且仅当它至少与一个好点相邻,求所有有用的点的权值和不超过 limlimlim 的方案数. n≤40n\ ...

最新文章

  1. signature=a8a3e788013f73439051c7287d7f5f0b,来用百度密语吧!!!
  2. 单机部署zookeeper、kafka
  3. JavaSE(十九)——equals() 和 == 的区别
  4. OpenGL HDR渲染
  5. hadoop3.1.2 配置 3台 完全分布式
  6. 什么是 “马太效应” ?
  7. leetcode —— 75. 颜色分类
  8. 12306 java_My12306-1.0 一个用java web写的仿12306火车订票系统 - 下载 - 搜珍网
  9. Timeline的Clip编辑模式总结
  10. 计算机显示器一半有阴影,电脑显示器有阴影的解决方法,希望你们喜欢!
  11. 亚马逊的人工智能Alexa竟然独自大笑 笑声很吓人(附视频)
  12. sim卡中电话本(ADN)的简要格式
  13. 手机评论文本挖掘与数据分析(Python)
  14. Android 商品详情页
  15. R语言——Error in plot.window(...) : ‘xlim‘值不能是无限的
  16. 美团笔试题:股票交易日
  17. F429的RTC当做stop模式下的唤醒源(FreeRTOS)
  18. 一阶电路中的时间常数_一阶RC电路的时间常数为 ;一阶RL电路的时间常数为
  19. 现象类话题和策论32133框架
  20. 大转盘抽奖活动免费创建

热门文章

  1. 宝塔中查看mysql默认密码
  2. java 封装 英文_java类的封装、继承、多态
  3. 12种方法禁用USB端口
  4. 最新kali之lbd
  5. Autodesk Maya 2024.1.0 三维动画建模软件官方中文正式版
  6. 洗地机什么牌子最好?洗地机品牌推荐排行榜
  7. 一问讲透到底什么才是运营,重新定义你对运营的理解
  8. springboot集成rabbitmq:fanout、topic
  9. 中国牙髓治疗行业市场供需与战略研究报告
  10. java jcifs ntlm_JCIFS NTLM