[CodeForces-332E]Binary Key
题目大意:
给你两个字符串p和s,让你求出一个字典序尽量小的长度为k的01串密钥,能将p转化为s。
密钥的工作方式如下:
第i位是0,表示这一位无用;
第i位是1,表示这一位有用。
若密钥的长度比s短,则可以通过循环的方式补齐。
思路:
由于密钥的长度为固定的k,我们可以先预处理出k个字符串p1,其中p1[i]是p中所有位置在mod k意义下为i的字符所构成的串。
接下来我们枚举密钥中出现的1的个数,对应的是密钥循环的周期长度。
每次还要处理出字符串s对应的s1。
然后从后往前贪心,枚举p1中的每个字符串p1[i]和s1中的每个字符串s1[p],如果p1[i]==s1[p]那么这一位可以是1。
由于是从后往前贪心,在这里选1肯定是相对更优的。
然后对于不同的1的个数,我们都可以找出一个字典序最小的密钥tmp,最后再找出其中字典序最小的即可。
注意字符串中可能会有空格和一堆奇怪的字符,所以必须得getline。
#include<string>
#include<iostream>
#include<algorithm>
const int K=;
int k,p_len,s_len;
std::string p,s,p1[K],s1[K],ans;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::getline(std::cin,p);
std::getline(std::cin,s);
std::cin>>k;
p_len=p.length(),s_len=s.length();
for(register int i=;i<p_len;i++) {
p1[i%k]+=p[i];
}
ans="";
int max_period=std::min(k,s_len);
for(register int i=;i<=max_period;i++) {
for(register int j=;j<i;j++) {
s1[j]="";
}
for(register int j=;j<s_len;j++) {
s1[j%i]+=s[j];
}
std::string tmp;
int p=i-;
for(register int i=k-;i>=;i--) {
if(p>=&&p1[i]==s1[p]) {
p--;
tmp+="";
} else {
tmp+="";
}
}
if(p<) {
std::reverse(tmp.begin(),tmp.end());
ans=std::min(ans,tmp);
}
}
if(ans=="") ans="";
std::cout<<ans<<std::endl;
return ;
}
[CodeForces-332E]Binary Key的更多相关文章
- CodeForces 1251B --- Binary Palindromes
[CodeForces 1251B --- Binary Palindromes] Description A palindrome is a string t which reads the sam ...
- Codeforces #662C Binary Table
听说这是一道$ Tourist$现场没出的题 Codeforces #662C 题意: 给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量 $ n ...
- Codeforces 838A - Binary Blocks(二维前缀和+容斥)
838A - Binary Blocks 思路:求一下前缀和,然后就能很快算出每一小正方块中1的个数了,0的个数等于k*k减去1的个数,两个的最小值就是要加进答案的值. 代码: #include< ...
- [CodeForces 663E] - Binary Table(FWT)
题目 Codeforces 题目链接 分析 大佬博客,写的很好 本蒟蒻就不赘述了,就是一个看不出来的异或卷积 精髓在于 mask对sta的影响,显然操作后的结果为mask ^ sta AC code ...
- [Codeforces]663E Binary Table
某变换好题.不过听说还有O(2^n*n^2)DP的…… Description 给定一个n*m的01矩阵,你可以选择对任意行和任意列取反,使得最终“1”的数量尽量少. Input 第一行两个整数n,m ...
- Codeforces.662C.Binary Table(状压 FWT)
题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵,你可以选择一些行和一些列并将其中所有的\(01\)反转.求操作后最少剩下多少个\(1\). \(n\le ...
- [CodeForces332E]Binary Key
Problem 题目给出一个加密前的字符串长度为p和加密后的字符串长度为s,让你求一个长度为K字典序最小的密钥. 密钥是循环的,第i位为1表示加密前的第i为是有用的否则是没用的. Solution 首 ...
- CodeForces 838A Binary Blocks(前缀和)题解
题意:给你个n*m的矩阵,要求你找到一个k,k > 1,使得矩阵可以分为很多k * k的小正方形,然后进行操作把每个小正方形都变为0或1,问你怎样使操作数最小. 思路:随便暴力不可取,显然你每次 ...
- CodeForces - 662C Binary Table (FWT)
题意:给一个N*M的0-1矩阵,可以进行若干次操作,每次操作将一行或一列的0和1反转,求最后能得到的最少的1的个数. 分析:本题可用FWT求解. 因为其0-1反转的特殊性且\(N\leq20\),将每 ...
随机推荐
- 【leetcode 简单】第三十六题 最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...
- VueJS 轻松支持 JSX 配置
使用: babel-preset-vue-app TODO
- JSOI 2017 Round 1滚粗记
day0 到常州一中报道,吃了午饭,好像这次有小火锅. 然后下午听JYY讲线性规划...好神啊. 晚上去试机,机子上没有npp,只有linux下的codeblocks,敲起来一顿一顿的...后来被迫使 ...
- ovirt系统磁盘删除后清理功能验证步骤
测试步骤主要是针对ovirt系统磁盘的‘删除后清理’功能,如下图所示: 测试如下两种方式: 预置条件: 搭建iscsi服务器,且划分一个11G的盘 勾选删除后清理操作步骤:1 .在linux虚拟机 d ...
- django 项目中的 favicon.ico 处理
django 项目中的 favicon.ico 处理 (django == 2.0.6) 1. 引入模块: from django.views.generic.base import Redirec ...
- java基础2 判断语句:if ... else 语句和 switch 语句
一.if ... else 判断语句 1.if ... else 判断语句的格式 1.1.格式一 if(判断条件){ 执行不满足条件的语句 } 1.2.格式二 if(判断语句){ 满足条件的语句 }e ...
- POJ 1386 Play on Words(单词建图+欧拉通(回)路路判断)
题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...
- django时差8个小时问题
问题现象: 在用django做好的网站,上传图片后显示的发布时间比当前时间差了8小时 查找问题: 查看服务器系统时间,经查与当前时间一致,无问题 查看数据库中的时间也一样 最终原因: 在setting ...
- Reverse Nodes in k-Group——简单的指针问题
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
- 小技巧:tar命令打包目录时,排除文件和目录的命令
今天不巧要用上,百度. tar zcvf fd.tar.gz pardir --exclude=pardir/file1 --exclude=pardir/dir1