[JZOJ6347]:ZYB玩字符串(DP+记忆化搜索)
题目描述
$ZYB$获得了一个神秘的非空字符串$p$。
初始时,串$S$是空的。
$ZYB$会执行若干次这样的操作:
$1.$选取$S$中的一个任意的位置(可以是最前面或者最后面)
$2.$在这个位置上插入一个完整的$p$,得到一个新的$S$。
但是$ZYB$不小心把$p$弄丢了。
他告诉你现在的$S$是什么,请帮他还原出可能的$p$。
如果有多个$p$符合要求,选取长度最短的。
如果仍然有多解,选取字典序最小的。
输入格式
从文件$string.in$中读入数据。
这道题有多组数据,第一行一个数$T$,表示数据组数。
对于每组数据,读入一行字符串,表示$S$。
输出格式
输出到文件$string.out$中。
一共$T$行,每行一个字符串$p$,表示对应的答案。
样例
样例输入:
1
hhehellolloelhellolo
样例输出:
hello
数据范围与提示
样例解释:
$S$为:
$1.$
$2.hello$
$3.hhelloello$
$4.hhelloelhellolo$
$5.hhehellolloelhellolo$
数据范围:
前$20\%$:$|S|\leqslant 8$
前$40\%$:$|S|\leqslant 20$
前$60\%$:$|S|\leqslant 100,\sum|S|\leqslant 300$
另有$10\%$:$S$是$p$等概率插入可行位置构造出来的。
另有$10\%$:$p$的长度不超过$3$。
$100\%$:$|S|\leqslant 200,T\leqslant 10,\sum|S|\leqslant 666$
题解
因为串$S$肯定有一段连续的是$p$(最后插进去的),所以可以枚举这个连续的串,再想办法判断就好了。
考虑$DP$,定义怪怪的,设$dp[l][r]$表示在当前枚举的长度为$len$的情况下,区间$[l,r]$除了前$(r-l)%len$位匹配了整串前缀以外剩下的部分都匹配了是否可行。
那么考虑转移,设$b$数组为当前$check$的这段区间:
$\alpha.dp[l][r]|=dp[l][r-1]\&(s[j]==b[(j-i)%len+1])$:多匹配了一位。
$\beta.dp[l][r]|=dp[i][j-k\times len]\&f[j-k\times len+1][j]$:后面有几段匹配了。
由于$\beta$转移的上界为$\frac{N}{len}$,所以最终的时间复杂度为$\Theta(\sum\limits_{len|N}(N-len+1)\times N^2\times\frac{N}{len}=\Theta(N^4)$。
不过可以对于每一个$p$,先判断一下其子集合法性,然后使用记忆化搜索即可。
时间复杂度:$\Theta(N^4)$(但是远远达不到)。
期望得分:$100$分。
实际的分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
char ch[201];
int n,a[201],b[201],ans[201];
int dp[201][201];
int mod(int x,int y){return x>y?mod(x-y,y):x;}
bool dfs(int x,int l,int r)
{
if(l>r)return 1;
if(dp[l][r]!=-1)return dp[l][r];
for(int mid=r-x;l<=mid;mid-=x)
if(dfs(x,l,mid)&&dfs(x,mid+1,r))
return dp[l][r]=1;
if(a[r]==b[mod(r-l+1,x)])return dp[l][r]=dfs(x,l,r-1);
return dp[l][r]=0;
}
bool judge(int x){for(int i=1;i<=x;i++)if(ans[i]>b[i])return 1;return 0;}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%s",ch+1);
n=strlen(ch+1);
for(int i=1;i<=n;i++)a[i]=ch[i]-'a'+1;
for(int i=1;i<=n;i++)
{
if(n%i)continue;bool res=0;
memset(ans,0,sizeof(ans));
for(int j=1;j<=n-i+1;j++)
{
memset(dp,-1,sizeof(dp));
for(int k=1;k<=i;k++)b[k]=a[j+k-1];
if(dfs(i,1,n)&&(!ans[1]||judge(i)))
for(int k=1;k<=i;k++)ans[k]=b[k];
}
if(ans[1]){for(int k=1;k<=i;k++)printf("%c",(char)(ans[k]+'a'-1));puts("");break;}
}
}
return 0;
}
rp++
[JZOJ6347]:ZYB玩字符串(DP+记忆化搜索)的更多相关文章
- 状压DP+记忆化搜索 UVA 1252 Twenty Questions
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...
- ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- SDUT 2893-B(DP || 记忆化搜索)
B Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 有n块地板排成一条直线,从左到右编号为1,2,3. . . n-1,n,每 ...
随机推荐
- DotNet跨平台 - .net core项目部署到centos7
环境说明 系统:CentOS Linux release 7.2.1511 (Core) 相关工具:VS2017 xftp 服务器软件:.net core2.0,nginx 准备.net core应 ...
- python3 多线程 采集 xpath
#!/usr/bin/python # -*- coding: UTF-8 -*- '''Thread3 多线程测试采集''' import threading,time,queue,Mongo_ut ...
- Android应用市场App发布
来自知乎 Android应用市场App发布说到官方渠道,不得不说一些主要的大市场了,如:360.小米.应用宝.91.安卓.百度.豌豆荚.安智.现在我来一一说它们的一些简单特点. 1,360 (1)当天 ...
- SIP中的SDP offer/answer交换初探
1.引言 SDP的offer/answer模型本身独立与于利用它的高层协议.SIP是使用offer/answer模型的应用之一.RFC 3264 定义了offer/answer模型,但没有规定使用哪个 ...
- Linux下创建NFS来实现共享文件
简介说明: 在项目生产环境我们经常需要实现文件共享,传统的常见方案是通过NFS,实现服务器之间共享某一块磁盘,通过网络传输将分散的文件集中存储在一块指定的共享磁盘,实现基本的文件共享.实现这种方案,分 ...
- Appium|Locator Strategy ... is not supported for this session
appim server log InvalidSelectorError: Locator Strategy 'xpath,//android.widget.TextView[@resource-i ...
- Sql 语法练习
select * from Student select * from Class select * from Score select * from Subject --1.查询出和张三住在同一个地 ...
- 启动Tomcat报错:A child container failed during start
在之前的工作和学习当中,有碰到过很多未知的,在当时看来十分令人疑惑的问题.当时的解决手段简单粗暴,就是直接百度,搜到对应的解决方案,直接抄过来试试,不行再换,直到问题消失,程序可以正常跑了,立马就不管 ...
- IDEA设置左侧边栏修改代码后变色
首先声明,此功能是基于版本控制的,不管是基于git或者是svn, 都要有版本控制方可使用. 平常情况下,IDEA左边栏是没有颜色的,如下图所示 当我们修改了代码,左侧就会有颜色显示, 右侧滚动条处也有 ...
- 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)
P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...