大意: 给定字符串$s$, 长度为$n$, 取$k=\lfloor log2(n)\rfloor$, 第$i$次操作删除一个长度为$2^{i-1}$的子串, 求一种方案使得, $k$次操作后$s$的字典序最小, 输出删除后的字符串.

考虑一些弱化的情况, 每次均删除长为$2$的子串, 共删除$k$次

那么很容易得出$O(n^3)$的$DP$.

int n, k;
string s, dp[N][N]; int main() {
cin>>s>>k;
n = s.size();
REP(i,1,n) REP(j,0,min(i/2,k)) {
dp[i][j] = dp[i-1][j]+s.substr(i-1,1);
if (i>=2&&j) dp[i][j] = min(dp[i][j], dp[i-2][j-1]);
}
cout<<dp[n][k]<<endl;
}

我们可以发现, $dp$过程中很多状态都是无用的, 只要一个状态的$DP$值的字典序大于另一个状态, 那么就没必要再继续往下转移了.

考虑解的结构, 解的第$i$位一定是$s[i,...,i+2k]$中的某个字符, 所以我们可以直接维护长为$2k+1$的最优转移状态, 这样就可以优化为$O(n^2)$

int n, k;
string s;
bitset<N> f; int main() {
cin>>s>>k;
if (!k) return cout<<s<<endl,0;
n = s.size();
f.set(0);
REP(i,0,n-2*k-1) {
REP(j,0,2*k) if (f[j]) f.set(j+2);
char x = 'z';
REP(j,0,2*k) if (f[j]) x=min(x,s[i+j]);
REP(j,0,2*k) if (x!=s[i+j]) f.reset(j);
putchar(x);
}
puts("");
}

而对于本题而言, 每次删除字符串总数只有$logn$, 那么状压一下即可, 长度$2^{i-1}$其实是可以改成任意的, 只不过为$2^{i-1}$时状态值恰好就等于字符串长, 方便处理一些, 完整代码如下, 复杂度是$O(kn^2)$

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
//head #ifdef ONLINE_JUDGE
const int N = 1e6+10;
#else
const int N = 111;
#endif int n, k;
char s[N];
bitset<N> f; int main() {
scanf("%s", s+1);
n = strlen(s+1);
k = log2(n), f.set(0);
int mx = (1<<k)-1, len = n-mx;
REP(i,1,len) {
char x = 'z';
REP(j,0,mx) if (f[j]) {
REP(kk,0,k-1) f.set(j|1<<kk);
}
REP(j,0,mx) if (f[j]) x = min(x, s[i+j]);
REP(j,0,mx) if (s[i+j]!=x) f.reset(j);
putchar(x);
}
puts("");
}

Erasing Substrings CodeForces - 938F (字符串dp)的更多相关文章

  1. Maximum Questions CodeForces - 900E (字符串,dp)

    大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$ ...

  2. Three Religions CodeForces - 1149B (字符串,dp)

    大意: 给定字符串S, 要求维护三个串, 支持在每个串末尾添加或删除字符, 询问S是否能找到三个不相交的子序列等于三个串. 暴力DP, 若不考虑动态维护的话, 可以直接$O(len^3)$处理出最少需 ...

  3. codeforces 938F(dp+高维前缀和)

    题意: 给一个长度为n的字符串,定义$k=\floor{log_2 n}$ 一共k轮操作,第i次操作要删除当前字符串恰好长度为$2^{i-1}$的子串 问最后剩余的字符串字典序最小是多少? 分析: 首 ...

  4. Dreamoon and Strings CodeForces - 477C (字符串dp)

    大意: 给定字符串$s$, $p$, 对于$0\le x\le |s|$, 求$s$删除$x$个字符后, $p$在$s$中的最大出现次数. 显然答案是先递增后递减的, 那么问题就转化求最大出现次数为$ ...

  5. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  6. Codeforces 1150D(字符串dp)

    反思 三维的dp压根没看出来,看题解以后思路又很直观,找几道字符串dp练练才行 序列自动机和优化一维略 /* __ __ * ____| |_____| |____ * | | * | __ | * ...

  7. 【BZOJ 2121】 (字符串DP,区间DP)

    2121: 字符串游戏 Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,B ...

  8. AtCoder Regular Contest 081 E - Don't Be a Subsequence(字符串DP)

    引用自:onion_cyc 字符串DP一直不是强项...以后没思路的题就想DP和网络流23333333 f[i]表示从i开始的后缀非子序列的最短长度  pos[i][j]表示从i开始的j字符最早出现位 ...

  9. NOIP2015Day2T2子串(字符串dp)

    又被“if(a=b)”坑了QAQ...写C++还是得开Warning,这么久了pascal还没改过来咋回事啊QWQ 题目大意就不说了OWO 网上的题解都不怎么看得懂啊...好像写得都很乱?还是我太sb ...

随机推荐

  1. Orcal设置默认插入数据的日期和时间

    CREATE TABLE TEST_DATE_TIME( id integer, operdate )default "TO_CHAR"(SYSDATE,'yyyy-MM-dd') ...

  2. vue.js 三种方式安装

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  3. Java 谷歌浏览器开发必备插件

    1.谷歌访问助手 下载网址:http://www.ggfwzs.com/ 2.Json Viewer 格式化请求接口,返回Json数据格式,可以在浏览器展示 3.Restlet client 一种类似 ...

  4. SOAP1.1&SOAP1.2

    http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?op=getTVstationString SOAP 1.1 以下 ...

  5. Jmeter之集合点

    Jmeter之集合点 Jmeter中也有集合点,看样子还是很强呀 哇哈哈 它只是通过计时器Synchronizing Timer实现的假集合点功能. 没有时间整理,来实际的,直接上图. 在线程下添加集 ...

  6. 性能测试的 Check List (不断更新中)

    1. 开发人员是否提交了测试申请?2. 测试对象是否已经明确?3. 测试范围是否已经明确?4. 本次不被测试的范围是否已经明确?5. 测试目标是否已经明确?6. 何时开始性能测试?7. 何时终止一轮性 ...

  7. spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)

    spring boot 使用jpa在pom.xml在上文中已经介绍过.在这里直接介绍各个类文件如何编写: 代码结构: domain(存放实体类文件): repository(存放数据库操作文件,相当于 ...

  8. 只含有一个Excel模板的工程发布问题

    遇到这样一个问题,某个项目不是dynamic web project,也不是java工程,里面只有一个Excel模板,这样的话,不能打成war包和jar包,不能通过eclipse发布至Tomcat,但 ...

  9. 【转】hbase meta表修复

    [From]https://www.iteye.com/blog/blackproof-2052898 meta表修复一 查看hbasemeta情况 hbase hbck .重新修复hbase met ...

  10. Python:Base2(List和Tuple类型, 条件判断和循环,Dict和Set类型)

    1.Python创建list: Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: &g ...