[ZROI #316] ZYB玩字符串
Introduction
每次在一开始为空的串$S$的任意位置插入串$p$
给出最终的$S$,求长度最短(相同时字典序最小)的串$p$
Solution:
样例出锅差评啊,让我这种直接看样例选手挂掉50分啊……
所以说不管怎么样都要好好看输入/输出格式,看看有没有多测
非常直观的思路就是$O(len^2)$枚举所有$S$的子串进行判断
暴力的话就是每次选择一个$p$将其删去并继续递归下去
同时对于随机的点可以直接上贪心:每次直接删去第一个$p$
接下来考虑满分算法
首先$O(len^2)$对$p$的枚举无法优化,只能优化判断的过程
发现每个串$p$被分为几段后,中间的每一段都是独立完整的一段
那么一段的合法性取决于其是否能分成几段合法段且剩下的组成当前字符串的前缀
这样将问题拆分后就可以$dp$了,用$dp[l][r]$来表示区间$[l,r]$是否合法,转移如下:
1、$r$属于最外层的串$p$:$dp[l][r]=dp[l][r-1]\&s[r]==sub[(r-l) mod len+1]$
2、$r$在完整的段中:$dp[l][r]=dp[l][r-len*k]\&dp[r-len*k+1][r]$
这样的转移明显不太容易递推,因此用记忆化搜索处理,复杂度上界为$O(len^4)$
不过这其实是一个很松的上界,首先$p$的长度必须为$len$的约数
同时可以对字符集个数判断(虽然我没写),而且由于是记忆化搜索状态数达不到$O(len^2)$
Tips:$string$在未赋值时长度为0,不能访问$string[i]$来赋值,是越界行为,要先$resize()$!
Code:
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
const int MAXN=;
string s,sub,res;
int len,T,dp[MAXN][MAXN],cur; int solve(int l,int r)
{
if(l>r) return ;
if(~dp[l][r]) return dp[l][r]; for(int mid=r-cur;mid>=l;mid-=cur)
if(solve(l,mid)&&solve(mid+,r))
return dp[l][r]=;
if(s[r-]==sub[(r-l)%cur]) return dp[l][r]=solve(l,r-);
return dp[l][r]=;
} int main()
{
cin>>T;
while(T--)
{
bool f=;cin>>s;len=s.size();
for(cur=;cur<=len;cur++)
if(len%cur==)
{
for(int j=;j<=len-cur;j++)
{
sub=s.substr(j,cur);
memset(dp,-,sizeof(dp));
if(solve(,len))
res=f?min(res,sub):sub,f=;
}
if(f){cout<<res<<endl;break;}
}
}
return ;
}
Review:
最近看了几篇文章感觉对动规有了更多的理解
动规其实是一种通过状态的定义和转移方程来将问题拆成多个子问题来解决的一种思想
实现方式究竟是递推还是记忆化搜索式的递归其实与其拆分问题的思想无关,用方便的即可
比如思考此题的心路历程:
发现合法字符串的性质,通过定义$dp[l][r]$根据性质将问题拆分写出转移方程
发现转移方程用递归的形式更容易实现,用记忆化搜索解决
[ZROI #316] ZYB玩字符串的更多相关文章
- [JZOJ6347]:ZYB玩字符串(DP+记忆化搜索)
题目描述 $ZYB$获得了一个神秘的非空字符串$p$. 初始时,串$S$是空的. $ZYB$会执行若干次这样的操作: $1.$选取$S$中的一个任意的位置(可以是最前面或者最后面) $2.$在这个位置 ...
- [JZOJ6347] 【NOIP2019模拟2019.9.8】ZYB玩字符串
题目 题目大意 有一个字符串\(p\).一开始字符串\(s\)为空串. 接下来进行若干次操作:在\(s\)的某个空隙中插入\(p\). 给出操作后的\(s\),问长度最小的\(p\). 思考历程 感觉 ...
- 正睿OI 提高 Day1T3 ZYB玩字符串(DP)
题目链接 设可能的答案串为p,长为len.p一定是s的一个子串且len|n. 虽然一些p在s中可能被断成若干段,但删掉其中的若干段后,这段区间一定会被全部消掉. 于是枚举p后,可以用f[i][j]表示 ...
- CF1107E Vasya and Binary String
比赛的时候又被垃圾题艹翻了啊. 这个题显然是区间dp 考虑怎么转移. 类似消除方块和ZYB玩字符串那样的一个DP. 可以从左到右依次考虑消除. dp[l][r][k][flag]表示区间l,r左边粘着 ...
- [考试反思]1113csp-s模拟测试113:一念
在这么考下去可以去混女队了2333 两天总分rank14,退役稳稳的 的确就是没状态.满脑子都是<包围保卫王国>ddp/LCT/ST,没好好考试. 我太菜了写题也写不出来考试也考不好(显然 ...
- 2019.11.12&13题解
写在前面: 虽然拿到了rk1,但是T3被卡常TLE90分,(考后再交就A了!?),lemon80,又丢失了一次良好的AK机会, 掐头去尾距离联赛仅剩2天,最近中午一直睡不好,可能是有些紧张, 希望自己 ...
- NOIP前一些题目的理解
ZYB和售货机(图论,环) 题目链接 个人感觉这道题与基环树没有任何关系,你会发现,每个点最多只有一个入度和出度,所以只能是链或环. 还有就是本题的突破点就在于正确建图,题目的限制保证每个点的入度不大 ...
- NOIP模拟57
前言 一整套都是水题(尽管 T4 稍有难度.. 从各位的分数上就可以看出来..Max 的 T1 打挂了,不然就有人 AK 了.. 感觉还好,最后还有 1h 看了看 T4 ,感觉有一点思路,就瞎 jb ...
- Noip模拟53 2021.9.14
T1 ZYB和售货机 首先这道题有两种做法. 一种是发现每个点都可以先被取到只剩一个,只要收益大于$0$ 然后发现建一个$i->f[i]$的图时出现环,要把它去掉, 那么跑一个$tarjan$枚 ...
随机推荐
- 用sqoop将mysql的数据导入到hive表中
1:先将mysql一张表的数据用sqoop导入到hdfs中 准备一张表 需求 将 bbs_product 表中的前100条数据导 导出来 只要id brand_id和 name 这3个字段 数据存 ...
- jq消除网页滚动条
网页有些时候需要能滚动的效果,但是不想要滚动条,我就遇到了这样的需求.自己用jq写了一个垂直滚动条. 纯css也可以实现 .box::-webkit-scrollbar{display:none} 但 ...
- DIDM源码分析
DIDM源码分析 版本来源:GitHub上Opendaylight DIDM项目 参考资料来源:DIDM:Developer Guide 概述 DIDM是设备标识与驱动管理(Device Identi ...
- Linux下用到数据库sqlite3
最近在Linux下用到数据库sqlite3,于是开始了该方面的学习. 0. 引言 我们这篇文章主要讲述了如何在C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库.创建 ...
- React 16 源码瞎几把解读 【三 点 二】 react中的fiberRoot
〇.先来看看常用的常量 NoWork = 0 noTimeout = undefined HostRoot = 3 NoContext = 0b000; AsyncMode = 0b001; Stri ...
- 用Centos7搭建小微企业Samba文件共享服务器【转】
转自 用Centos7搭建小微企业Samba文件共享服务器 - 今日头条(www.toutiao.com)http://www.toutiao.com/i6436937837660078593/ 最近 ...
- libuv 一 环境搭建, hello TTY
引言 - 一时心起, libuv linux 搭建 有一天突然想起来想写个动画. 找了一下 ui 库太大. 后面想起以前弄过的 libuv. 但发现 libuv 相关资料也很少. 所以就有了这些内容. ...
- python爬取漫画
抓取漫画的网址是:sf互动传媒 抓取漫画的由来也是看了知乎上有人说用爬取漫画,然后自己也玩玩 首页中每个漫画的url是类似这样存储的: <tr> <td height="3 ...
- 百度NLP二面-电话面
实验室项目:1.实验室方向 2.用两分钟介绍自己的项目,创新点在哪里 个人项目: 1.自己实现的贝叶斯分类器,目的,怎么做的 2.怎么计算各个分类的先验.(因为我使用的训练预料是每个分类10篇 ...
- 【hdoj_2100】Lovekey(大数+字符处理)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2100 根据题目意思,现将字符串转化为10进制,再采用10进制加法相加,再转化为26进制. 另一种直接的思路 ...