常州模拟赛d1t5 遗忘口令
就像每个人都会遇到的问题一样,贝西忘了在 cowtube 上的口令。不过,她还记着一些关于口令
的信息。首先,她确定口令由小写字母组成,长度为 L。其次,这个密码是由几个单词组合而成
的。贝西一共认识 N 个单词,每个单词长度都在 1 到 20 之间,由小写字母组成。最后,贝西还
记得口令上一些位置的字母,她会尽量提供记住的部分,如果有些位置上的字母不记得了,就用?
代替。
给定贝西记得的口令片段和她认识的单词列表,请恢复出她的口令,如果完全符合条件的口令不
止一个,输出按照字典序排在最前面的那个。
输入输出格式
输入格式:
第一行:两个用空格分开的整数:L 和 N,1≤L≤1000,1≤N≤1000
第二行:一个 L 长的字符串,代表口令 P
第三行到 N+2 行:第 i+2 有一个字符串 W_i,表示贝西认识的第 i 个单词 W_i
输出格式:
第一行:一个字符串,表示符合条件的,在字典序下最靠前的口令
输入输出样例
15 6
a??l?ban???????
apple
cow
farmer
banana
bananas
pies
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 遗忘口令的更多相关文章
- 常州模拟赛d4t1 立方体
题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...
- 常州模拟赛d7t3 水管
分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...
- 常州模拟赛d6t3 噪音
FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是群体动 ...
- bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2
3743: [Coci2015]Kamp Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 484 Solved: 229[Submit][Status ...
- 常州模拟赛d5t2 mogician
分析:一个暴力的思想是枚举g,然后枚举每个数ai,看能不能符合要求,这样复杂度是O(nA)的,直接T掉了.也没什么其他的办法了,在暴力的基础上优化一下,优化的关键是要如何快速统计出不满足要求的数的个数 ...
- 常州模拟赛d5t1 journalist
分析:出题人丧心病狂卡spfa......只能用dijkstar+堆优化. 主要的难点是字典序的处理上,一个想法是在做最短路的时候处理,边松弛边记录,比个大小记录最佳答案.具体的思路大概和最短路计数差 ...
- 常州模拟赛d4t3 字符串划分
题目描述 给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母 都不相同,并且希望分的段数尽量少. 然后,把这些小段按字典序排序后输出,中间由一个空格分隔. 例如:字符 ...
- 常州模拟赛d4t2 陶陶摘苹果
题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 n 个苹果.苹果成熟的时候,陶陶就会 跑去摘苹果. 陶陶的手不能弯 (他仅能把手伸直),当且仅当陶陶达到的高度与苹果的高度相等的时候,陶陶 ...
- 常州模拟赛d3t3 两只怪物心心相印
题目背景 从前我是一位无名的旅人,旅途中我得到了某样东西:贤者之石.我因此得到悠久的时光和漂泊的生命.1897年冬天,我一时兴起舍弃了旅人的生活. 贤者之石创造出来的,是货真价实的黄金.我的名声传遍了 ...
随机推荐
- AS学习系列[1]——初识Android Studio
写在前面的话:由于于方老师的高墙所限,网络成了学习Android第一道“拦路虎”.所以,个人以为,在学习Android之前需要了解下FQ技术(仅仅是为了技术学习). 1.AS AS(Android s ...
- bzoj 2658
首先考虑容斥 我们计算出所有没有点在其中的矩形,然后用所有矩形减去这些矩形即可 然后考虑如何计算没有点在其中的矩形 采用扫描线的思想,从上向下一行一行扫,假设我们扫到的行编号是$a$,然后考虑如果左右 ...
- Injection of autowired dependencies failed;错误解决
代码自动生成的时候可能出现这个问题,反正我是找了半天才发现.serviceimp层不要写抽象类的声明abstract,这个删掉.
- 结合浅层高层特征的paper总结
1.ION:在conv3.conv4.conv5和context features上分别进行roi_pooling,在channel那一维进行concat 2.Hypernet:在较浅层max_poo ...
- 玩4K必备知识:HDMI1.4、2.0、2.0a、2.0b接口参数对比【扫盲贴】
https://www.4k123.com/thread-55369-1-1.html 前言:玩4K的同学都知道,HDMI接口是视频传输最常用的接口,但是这个接口却有好几个版本HDMI1.4.HDMI ...
- C++系统学习之八:IO库
新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...
- [HIHO] 1050 树中的最长路
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- verilog behavioral modeling--branch statement
conditional statement case statement 1. conditional statement if(expression) statement_o ...
- aggregate和annotate使用
aggregate和annotate方法的使用场景 Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询,是Django高手们必需要熟练掌握的.当我们需要对查询集( ...
- Python的第二堂课(2)
一.初探python print('Hello,靓仔!') 不得不说,这句话还是so real的(逃 二.Python中的变量 1.什么是变量?(what) 量:记录某种现实世界中事物的某种状态: 变 ...