就像每个人都会遇到的问题一样,贝西忘了在 cowtube 上的口令。不过,她还记着一些关于口令

的信息。首先,她确定口令由小写字母组成,长度为 L。其次,这个密码是由几个单词组合而成

的。贝西一共认识 N 个单词,每个单词长度都在 1 到 20 之间,由小写字母组成。最后,贝西还

记得口令上一些位置的字母,她会尽量提供记住的部分,如果有些位置上的字母不记得了,就用?

代替。

给定贝西记得的口令片段和她认识的单词列表,请恢复出她的口令,如果完全符合条件的口令不

止一个,输出按照字典序排在最前面的那个。

输入输出格式

输入格式:

第一行:两个用空格分开的整数:L 和 N,1≤L≤1000,1≤N≤1000

第二行:一个 L 长的字符串,代表口令 P

第三行到 N+2 行:第 i+2 有一个字符串 W_i,表示贝西认识的第 i 个单词 W_i

输出格式:

第一行:一个字符串,表示符合条件的,在字典序下最靠前的口令

输入输出样例

输入样例#1:

15 6
a??l?ban???????
apple
cow
farmer
banana
bananas
pies
输出样例#1:

applebananapies
样例解释
(有两个可行的组合,一个是 applebananapies,还有一个是 applebananascow,前者较靠前)

说明

对于 30% 的数据,有 1 ≤ L,N≤ 30。

对于 100% 的数据,有 1 ≤ L,N≤ 1, 000。

分析:万万没想到这道题还能用dp做,大开眼界啊,但是时间紧直接打了个暴力还有20分?

其实这道题很像0-1背包啊,每个口令的容积就是它的长度,价值就是它的字典序的贡献,只不过多了几个限制,最关键的是字符串中间一定不能有空串,也就是说不能拼接成apple  banana这样的,所以要加一个特判,dp就很好想啦,设f[i]为前i个字符的组合,那么f[i] = min{f[i-j.size()] + j}.

这种字符串的下标处理真的是超级超级烦人.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<map>
#include<string> using namespace std; int l, n;
string p,w[],f[]; bool check(int x, int y)
{
for (int i = x - w[y].size() + , j = ; i <= x; i++, j++)
if (p[i] != '?' && p[i] != w[y][j])
return false;
return true;
} int main()
{
scanf("%d%d", &l, &n);
cin >> p;
for (int i = ; i <= n; i++)
cin >> w[i];
for (int i = ; i <= l; i++)
for (int j = ; j <= n; j++)
{
int sizee = w[j].size();
if (sizee > i || (f[i - sizee] == "" && i - sizee != ))
continue;
if (check(i - , j))
{
if (f[i] == "")
f[i] = f[i - sizee] + w[j];
else
f[i] = min(f[i], f[i - sizee] + w[j]);
}
}
cout << f[l] << endl; return ;
}

常州模拟赛d1t5 遗忘口令的更多相关文章

  1. 常州模拟赛d4t1 立方体

    题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...

  2. 常州模拟赛d7t3 水管

    分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...

  3. 常州模拟赛d6t3 噪音

    FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是群体动 ...

  4. bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2

    3743: [Coci2015]Kamp Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 229[Submit][Status ...

  5. 常州模拟赛d5t2 mogician

    分析:一个暴力的思想是枚举g,然后枚举每个数ai,看能不能符合要求,这样复杂度是O(nA)的,直接T掉了.也没什么其他的办法了,在暴力的基础上优化一下,优化的关键是要如何快速统计出不满足要求的数的个数 ...

  6. 常州模拟赛d5t1 journalist

    分析:出题人丧心病狂卡spfa......只能用dijkstar+堆优化. 主要的难点是字典序的处理上,一个想法是在做最短路的时候处理,边松弛边记录,比个大小记录最佳答案.具体的思路大概和最短路计数差 ...

  7. 常州模拟赛d4t3 字符串划分

    题目描述 给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母 都不相同,并且希望分的段数尽量少. 然后,把这些小段按字典序排序后输出,中间由一个空格分隔. 例如:字符 ...

  8. 常州模拟赛d4t2 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 n 个苹果.苹果成熟的时候,陶陶就会 跑去摘苹果. 陶陶的手不能弯 (他仅能把手伸直),当且仅当陶陶达到的高度与苹果的高度相等的时候,陶陶 ...

  9. 常州模拟赛d3t3 两只怪物心心相印

    题目背景 从前我是一位无名的旅人,旅途中我得到了某样东西:贤者之石.我因此得到悠久的时光和漂泊的生命.1897年冬天,我一时兴起舍弃了旅人的生活. 贤者之石创造出来的,是货真价实的黄金.我的名声传遍了 ...

随机推荐

  1. Memcache笔记01-Memcache的安装

    memcached是什么? Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的has ...

  2. 异步 ThreadPool

    线程池是单例,一个进程里只有一个线程池 private void btnThreadPool_Click(object sender, EventArgs e) { Stopwatch watch = ...

  3. VirtualBox Network设置的NAT和Bridged Adapter模式区别

    区别: NAT模式下,虚拟机仍然可以访问网络,但是从网络接收者的眼中看来,这些网络请求都来自宿主机,而感知不到虚拟机.外网也无法访问虚拟机网络.虚拟机和宿主机器的IP地址在不同的子网,比如192.16 ...

  4. C语言二维数组作为函数参数

    设有整型二维数组a[3][4]如下:0   1   2   34   5   6   78   9  10  11 它的定义为:    int a[3][4]={{0,1,2,3},{4,5,6,7} ...

  5. chm文件帮助功能全解

    在winform中点击某个按钮弹出关于这个窗体的功能的具体解释文档方法如下: 第一步,使用chm编译工具修改chm每个文档的url 修改完成后保存确认能否打开, 如果不能就使用这个软件的转换功能把ch ...

  6. 火狐浏览器返回不加载JS

    火狐浏览器 go(-1),返回后不加载JS,谷歌会加载. 总结: Firefox和Safari在back时不会触发load, ready事件! 解决方法: $(window).unload(funct ...

  7. Use-After-Free

    0x00 UAF利用原理 uaf漏洞产生的主要原因是释放了一个堆块后,并没有将该指针置为NULL,这样导致该指针处于悬空的状态(这个指针可以称为恶性迷途指针),同样被释放的内存如果被恶意构造数据,就有 ...

  8. (56)zabbix Screens视图配置

    screen翻译成中文为“屏幕”,在超市.单位等等地方都比较常见到监控视频,视频上有多块小视频,实际上zabbix screen和这个功能类似.你可以设置多个screen,每个screen可以显示特定 ...

  9. GIMP图片头发的处理

    1/选中图片,添加Alpha Channel 2/点击Duplicate Layer,复制图层: 3/接着需要调整一下色差,选中Color下的Curves,调节曲线,使背景看起来更白一点 4/选中Co ...

  10. [转载] Python数据类型知识点全解

    [转载] Python数据类型知识点全解 1.字符串 字符串常用功能 name = 'derek' print(name.capitalize()) #首字母大写 Derek print(name.c ...