首页 > 其他分享 >CF938F Erasing Substrings 题解

CF938F Erasing Substrings 题解

时间:2023-10-12 19:38:05浏览次数:41  
标签:Erasing int 题解 最小 Substrings DP 字典

Erasing Substrings

一个神奇的想法是设 \(f_{i,j}\) 表示在位置 \([1,i]\) 中,我们删去了长度为 \(2^k(k\in j)\) 的一些串,所能得到的最小字典序。使用二分加哈希可以做到 \(O(n^2\log^2 n)\),无法承受。

发现对于状态 \(f_{i,j}\),它已经确定了 \(i-j\) 位的串,因为所有 \(\in j\) 的 \(2^k\) 之和就是 \(j\);而依据字典序的性质,只有这 \(i-j\) 位所表示的字典序最小的那些状态,才会成为最终的答案。当然,前提是状态 \(f_{i,j}\) 合法,即剩下的部分中可以安放下尚未被删去的串。

于是我们就可以考虑直接令 \(f_{i,j}\) 表示在所有长度为 \(i-j\) 的串中,它是否是字典序最小的串之一;然后,就可以按照 \(i-j\) 递增的顺序进行 DP。你自然可以倒着复原出路径,但是更好的方法是在 DP 第 \(i-j\) 位的时候,当我们找出了这位最小能填入什么字符后,直接输出。

下面我们考虑转移。一种情况是 \(f_{i,j}\rightarrow f_{i+1,j}\) ,此时是第 \(i+1\) 位被保留下来,因此这个转移的前提是第 \(i+1\) 位上可以填入最小的字符;

还有一种情况就是第 \(i+1\) 位被删去,于是我们枚举 \(k\notin j\),直接转移即可。

注意到代码实现与此处描述有一些区别,描述中的递推式是刷表法,而代码中的递推式是填表法;同时,代码中的 DP 顺序上文已经提到,\(i-j\) 递增的顺序。

#include<bits/stdc++.h>
using namespace std;
const int N=5e3+100;
int n,m,all;
bool f[N][N];
char s[N];
int main(){
    scanf("%s",s+1);
	n=strlen(s+1);
    while((2<<m)<=n) m++;
	all=(1<<m);
    for(int i=0;i<all;i++) f[i][i]=1;
    for(int i=1;i<=n-all+1;i++){
        char lim=127;
        for(int j=i;j<i+all;j++) if(f[j-1][j-i]) lim=min(lim,s[j]);
        putchar(lim);
        for(int j=i;j<i+all;j++) f[j][j-i]=(f[j-1][j-i]&&(s[j]==lim));
        for(int j=i;j<i+all;j++){
			for(int k=0;k<m;k++){
				if((j-i)&(1<<k)) f[j][j-i]|=f[j-(1<<k)][j-i-(1<<k)];
			}
		}
    }
    return 0;
} 

标签:Erasing,int,题解,最小,Substrings,DP,字典
From: https://www.cnblogs.com/xuantianhao/p/17760350.html

相关文章

  • [AGC030F] Permutation and Minimum 题解
    PermutationandMinimum看到300的数据范围,再加上计数题,很容易就往计数DP方向去想。为方便,我们将\(n\)乘二。因为是两个位置取\(\min\),于是我们便想到从小往大把每个数填入序列。于是DP数组第一维的意义便出来了:当前已经填入了前\(i\)小个数。考虑当前填入一个数。这......
  • 洛谷P3576 [POI2014] MRO-Ant colony 题解
    MRO-Antcolony根据下取整除法的性质\((\left\lfloor\dfrac{\left\lfloor\dfrac{x}{y}\right\rfloor}{z}\right\rfloor=\left\lfloor\dfrac{x}{yz}\right\rfloor)\),我们可以反向考虑,即从特殊边开始,计算出从每个叶子到特殊边的路径上,要除以的那个分母是什么。这个可以直接一遍df......
  • 洛谷P3713 [BJOI2017] 机动训练 题解
    机动训练这题的瓶颈,在于把\(a_i^2\)看作\(\sum\limits_{i=1}^{a_i}\sum\limits_{j=1}^{a_i}1\),然后我们就可以看成“两两相同的机动路径都能贡献1”。于是我们设\(f_{x1,y1,x2,y2}\)表示两条起点为\((x1,y1)\)和\((x2,y2)\)的相同路径的数量,然后分别枚举两条路径的方向......
  • [AGC013E] Placing Squares 题解
    PlacingSquares关键是将问题从抽象的“正方形面积”转为具象的形式:一段长度为\(d\)的区间,有两个不同的小球要放进去,则总放置方案就是\(d^2\),且不同的区间间方案是通过乘法原理结合的,刚好是题目中\(\prodd^2\)的形式。于是我们可以设计DP:设\(f_{i,j}\)表示前\(i\)个......
  • 洛谷P3118 [USACO15JAN] Moovie Mooving G 题解
    MoovieMoovingG设\(f[i][S]\)表示在第\(i\)场(注意是场,不是部)电影时,已经看了\(S\)里面的电影是否合法。然后贪心地取\(|S|\)最小的状态保存。光荣MLE了,\(21\%\)。发现当一场电影结束后,无论这一场是在哪里看的都没关系。因此我们设\(f[S]\)表示只看集合\(S\)里......
  • CF908D New Year and Arbitrary Arrangement 题解
    NewYearandArbitraryArrangement思路:期望题果然还是恶心呀!我们设\(f[i][j]\)表示当串中有\(i\)个\(a\)和\(j\)个\(ab\)时的方案数。为了方便,设\(A=\dfrac{P_a}{P_a+P_b},B=\dfrac{P_b}{P_a+P_b}\)。显然,可以这样转移:\[f[i][j]=f[i+1][j]\timesA+f[i][i+j]\ti......
  • CF264B Good Sequences 题解
    GoodSequences状态很显然,设\(f[i]\)表示位置\(i\)的最长长度。关键是转移,暴力转移是\(O(n^2)\)的,我们必须找到一个更优秀的转移。因为一个数的质因子数量是\(O(\logn)\)的,而只有和这个数具有相同质因子的数是可以转移的;因此我们可以对于每个质数\(p\),设一个\(mx_p......
  • 题解 AtCoder wtf22_day1_b【Non-Overlapping Swaps】
    题解AtCoderwtf22_day1_b【Non-OverlappingSwaps】problem给定一个排列,要求交换最多\(n-1\)对元素,使得这个排列变成[1,2,...,n]的有序排列。当然没有那么简单,对于交换还是有限制的,对于相邻的两次交换,不妨叫做\((l_i,r_i)\)和\((l_{i+1},r_{i+1})\),必须满足这两个交......
  • 题解 CF486D Valid Sets
    题目链接相当牛逼。这种找数量的题型,确定树形\(dp\)没跑了。首先思考常规树形\(dp\),不难想到设\(f_{u,a,b}\)表示以\(u\)为根节点的子树内(包括点\(u\)),最大值是\(a\),最小值是\(b\)的连通子图数量,转移很容易,但是这样时间空间复杂度是\(\rmO(n^3)\),而且无论是状态上......
  • Debian12安装elasticsearch实践及问题解决方案
    一、安装安装其实很简单,直接上官网链接:下载地址,官网提供了所有安装方式,总一款适合你。我的目标系统是Debian12,包管理是apt-get,所以就以这个为示例,仅供参考。1、先选择需要安装的版本2、导入ElasticsearchPGP密钥wget-qO-https://artifacts.elastic.co/GPG-KEY-elastic......