Description

给定一个长度为 \(n\) 的字符串,尽可能包含小写字母,字符 '?' 和字符 ‘*’。保证上面两种特殊字符若出现则一定出现在一个小写字母的后面一位。要求构造一个长度为 \(k\) 的新字符串,它和原串有如下关系:

按照原串的字母顺序向新串中填充,新串中含且仅含小写字母。

若原串的某小写字母后没有特殊字符,则这个字母在新串中必须保留

若原串的某小写字母后有字符 '?',则这个字母在新串中可以被保留,也可以被删除

若原串某小写字母后有字符 '*',则这个字母在新串中可以被保留,可以被删除,也可以被复读很多遍。

Input

第一行是一个长度为 \(n\) 的字符串,保证输入合法

第二行是一个整数 \(k\) 代表要求构造的新串长度

Output

输出一行一个长度为 \(k\) 的字符串,为构造出的串。

若不存在这样的串,输出“Impossible”(不含引号)

Hint

\(1~\leq~n,k~\leq~200\)

Solution

为啥泥萌一个贪心就过了啊qaq,为啥就我一人写了个DP还fst了啊qaq,我咋这么菜啊qaq

我们发现一个字母分别有三种情况:保留,保留/删除,保留/删除/复读。

于是我们处理一个新的字符串,只含给定串中的小写字母,另开数组记录该字母对应哪种情况。一下说的原串均指这个只含小写字母的新串,设原串长度为 \(len\)。

于是问题就被转化为了按照原串一位一位的按照规则填能否填出一个长度为 \(k\) 的字符串。这显然是可以DP的。

其实正着DP大概是可做的,但是比赛的时候有点困就直接倒着DP的。我们设 \(f_{i,j}~=~true/false\) 为能否用原串 \([i,len]\) 位拼出新串的 \([j,k]\) 位。于是转移一共有三种情况:

1、只能保留:

\[f_{i,j}~=~f_{i + 1,j + 1}
\]

2、保留或删除:

\[f_{i,j}~=~f_{i + 1,j + 1}~or~f_{i + 1,j}
\]

3、保留,删除,复读:

\[f_{i,j}~=~f_{i + 1,j + 1}~or~f_{i + 1,j}~or~\bigvee_{h = j + 2}^{k + 1} f_{i + 1, h}~=~\bigvee_{h = j}^{k + 1} f_{i + 1, h}
\]

其中 \(\bigvee_{i = a}^{b} s(i)\) 为若 \(\exists~i_0~\in~[a,b],~s.t.~~s(i_0)~=~true\) 则返回 \(true\),否则返回 \(false\)

初始化为 \(f_{len + 1, k + 1} = true\)

在转移时记录一下转移方向就可以输出方案了。

Code

#include <cstdio>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#endif
#define rg register
#define ci const int
#define cl const long long typedef long long ll; namespace IPT {
const int L = 1000000;
char buf[L], *front=buf, *end=buf;
char GetChar() {
if (front == end) {
end = buf + fread(front = buf, 1, L, stdin);
if (front == end) return -1;
}
return *(front++);
}
} template <typename T>
inline void qr(T &x) {
rg char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
if (lst == '-') x = -x;
} template <typename T>
inline void ReadDb(T &x) {
rg char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch = IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = x * 10 + (ch ^ 48), ch = IPT::GetChar();
if (ch == '.') {
ch = IPT::GetChar();
double base = 1;
while ((ch >= '0') && (ch <= '9')) x += (ch ^ 48) * ((base *= 0.1)), ch = IPT::GetChar();
}
if (lst == '-') x = -x;
} namespace OPT {
char buf[120];
} template <typename T>
inline void qw(T x, const char aft, const bool pt) {
if (x < 0) {x = -x, putchar('-');}
rg int top=0;
do {OPT::buf[++top] = x % 10 + '0';} while (x /= 10);
while (top) putchar(OPT::buf[top--]);
if (pt) putchar(aft);
} const int maxn = 210; int Len, k, len;
char MU[maxn], CU[maxn];
int pre[maxn][maxn], vc[maxn];
bool frog[maxn][maxn]; void print(ci, ci); int main() {
freopen("1.in", "r", stdin);
do MU[++Len] = IPT::GetChar(); while (((MU[Len] >= 'a') && (MU[Len] <= 'z')) || (MU[Len] == '?') || (MU[Len] == '*'));
for (rg int i = 1; i <= Len; ++i) if ((MU[i] >= 'a') && (MU[i] <= 'z')) {
CU[++len] = MU[i];
switch (MU[i + 1]) {
case '?': {
vc[len] = 1;
break;
}
case '*': {
vc[len] = 2;
break;
}
}
}
qr(k);
frog[len + 1][k + 1] = true;
rg int dk = k + 1;
for (rg int i = len; i; --i) {
rg int di = i + 1;
for (rg int j = 1; j <= dk; ++j) {
switch(vc[i]) {
case 0: {
if (frog[di][j + 1]) {
frog[i][j] = true;
pre[i][j] = j + 1;
}
break;
}
case 1: {
if (frog[di][j + 1]) {
frog[i][j] = true;
pre[i][j] = j + 1;
} else if (frog[di][j]) {
frog[i][j] = true;
pre[i][j] = j;
}
break;
}
case 2: {
for (rg int h = j; h <= dk; ++h) if (frog[di][h]) {
frog[i][j] = true;
pre[i][j] = h;
break;
}
break;
}
}
}
}
if (frog[1][1]) print(1, 1);
else puts("Impossible");
return 0;
} void print(ci cur, ci v) {
if (cur > len) return;
for (rg int i = v; i < pre[cur][v]; ++i) putchar(CU[cur]);
print(cur + 1, pre[cur][v]);
}

【DP】【CF1099C】 Postcard的更多相关文章

  1. T2980 LR棋盘【Dp+空间/时间优化】

    Online Judge:未知 Label:Dp+滚动+前缀和优化 题目描述 有一个长度为1*n的棋盘,有一些棋子在上面,标记为L和R. 每次操作可以把标记为L的棋子,向左移动一格,把标记为R的棋子, ...

  2. 【10.3校内测试【国庆七天乐!】】【DP+组合数学/容斥】【spfa多起点多终点+二进制分类】

    最开始想的暴力DP是把天数作为一个维度所以怎么都没有办法优化,矩阵快速幂也是$O(n^3)$会爆炸. 但是没有想到另一个转移方程:定义$f[i][j]$表示每天都有值的$i$天,共消费出总值$j$的方 ...

  3. 【DP+树状数组】BZOJ1264-[AHOI2006]基因匹配Match

    [题目大意] 给定n个数和两个长度为n*5的序列,两个序列中的数均有1..n组成,且1..n中每个数恰好出现5次,求两个序列的LCS. [思路] 预处理每个数字在a[i]中出现的五个位置.f[i]示以 ...

  4. BZOJ1079 [SCOI2008]着色方案 【dp记忆化搜索】

    题目 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+-+ck=n.相邻两个木块涂相同色显得很难看 ...

  5. 【DP|多重背包可行性】POJ-1014 Dividing

    Dividing Time Limit: 1000MS Memory Limit: 10000K Description Marsha and Bill own a collection of mar ...

  6. COGS 862. 二进制数01串【dp+经典二分+字符串】

    862. 二进制数01串 ★   输入文件:kimbits.in   输出文件:kimbits.out   简单对比 时间限制:1 s   内存限制:128 MB USACO/kimbits(译 by ...

  7. CodeForces - 597C Subsequences 【DP + 树状数组】

    题目链接 http://codeforces.com/problemset/problem/597/C 题意 给出一个n 一个 k 求 n 个数中 长度为k的上升子序列 有多少个 思路 刚开始就是想用 ...

  8. hihocoder1475 数组分拆【DP+前缀和优化】

    思路: DP[ i ] 代表以 i 结尾的方案数. dp[i] += sum[i] - sum[j - 1] != 0 ? dp[j] : 0 ; 对于100%的数据,满足1<=N<=10 ...

  9. SPOJ130 【DP·背包选取特性】

    题意: 给你n个任务,每个任务有一个起始时间,持续时间,一个权值: 问你怎么分配得到最大值 思路: 数据好大..百度了一发意识到自己好菜啊!背包的特性. dp[i]代表前 i 个能构成的最大值. 对于 ...

  10. lightoj1145 【DP优化求方案】

    题意: 有一个k面的骰子,然后问你n个骰子朝上的面数字之和=s的方案: 思路: dp[i][j] 代表 前 i 个骰子组成 j 有多少种方案: 显然 dp[i][j] = dp[i - 1][j - ...

随机推荐

  1. Cocos2dx源码赏析(4)之Action动作

    Cocos2dx源码赏析(4)之Action动作 本篇,依然是通过阅读源码的方式来简单赏析下Cocos2dx中Action动画的执行过程.当然,这里也只是通过这种方式来总结下对Cocos2dx引擎的理 ...

  2. (二)Hyperledger Fabric 1.1安装部署-Fabric Samples

    Hyperledger Fabric Samples是官方推荐的First Network,对于熟悉fabric和测试基础环境很有好处. Fabric Samples源码下载:使用git下载源码,进入 ...

  3. Redis集群搭建与使用

    前端时间开发中需要用到redis缓存数据,考虑到单台redis的不稳定性,后采用redis集群的方式来实现,由于之前没有接触过,过程中也是踩了不少的坑,拖了三天总算是搞定了,最近公司比较闲,总结了一下 ...

  4. Tomcat安全管理规范

    s 前言 随着公司内部使用Tomcat作为web应用服务器的规模越来越大,为保证Tomcat的配置安全,防止信息泄露,恶性攻击以及配置的安全规范,特制定此Tomcat安全配置规范. 定位:仅对tomc ...

  5. 《校友聊—方便使用之NABCD》

    <校友聊—方便使用之NABCD> 方便使用特点的分析与总结: N:由于一些软件的人机交互性很差,人性化性能低,使用不方便,故,鉴于此需求:A:用户可根据系统界面的友好提示一步步进行:B:提 ...

  6. IIs8 svc

    IIS8中添加WCF支持几种方法小结[图文] 方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不 ...

  7. Scapy之ARP询问

    引言 校园网中,有同学遭受永恒之蓝攻击,但是被杀毒软件查下,并知道了攻击者的ip也是校园网.所以我想看一下,这个ip是PC,还是路由器. 在ip视角,路由器和pc没什么差别. 实现 首先是构造arp报 ...

  8. bug--注意Android编译打包--找不到某某类

    http://blog.csdn.net/mad1989/article/details/9142557 看到这篇 才解决问题= = 15,ClassNotFoundException: Didn't ...

  9. POJ2823(单调队列方法解题)

    因为不太好复制,我就直接截图了,题目链接:题目大致的意思是:给一串数字,然后要你求出每k长度的连续子序列中的最大值以及最小值并输出:这题就是一个最简单的运用单调队列方法解题的例子. 解题思路:通过单调 ...

  10. 蜗牛慢慢爬 LeetCode 15. 3Sum [Difficulty: Medium]

    题目 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...