题目大意:
  给你两个字符串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的更多相关文章

  1. CodeForces 1251B --- Binary Palindromes

    [CodeForces 1251B --- Binary Palindromes] Description A palindrome is a string t which reads the sam ...

  2. Codeforces #662C Binary Table

    听说这是一道$ Tourist$现场没出的题 Codeforces #662C 题意: 给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量 $ n ...

  3. Codeforces 838A - Binary Blocks(二维前缀和+容斥)

    838A - Binary Blocks 思路:求一下前缀和,然后就能很快算出每一小正方块中1的个数了,0的个数等于k*k减去1的个数,两个的最小值就是要加进答案的值. 代码: #include< ...

  4. [CodeForces 663E] - Binary Table(FWT)

    题目 Codeforces 题目链接 分析 大佬博客,写的很好 本蒟蒻就不赘述了,就是一个看不出来的异或卷积 精髓在于 mask对sta的影响,显然操作后的结果为mask ^ sta AC code ...

  5. [Codeforces]663E Binary Table

    某变换好题.不过听说还有O(2^n*n^2)DP的…… Description 给定一个n*m的01矩阵,你可以选择对任意行和任意列取反,使得最终“1”的数量尽量少. Input 第一行两个整数n,m ...

  6. Codeforces.662C.Binary Table(状压 FWT)

    题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵,你可以选择一些行和一些列并将其中所有的\(01\)反转.求操作后最少剩下多少个\(1\). \(n\le ...

  7. [CodeForces332E]Binary Key

    Problem 题目给出一个加密前的字符串长度为p和加密后的字符串长度为s,让你求一个长度为K字典序最小的密钥. 密钥是循环的,第i位为1表示加密前的第i为是有用的否则是没用的. Solution 首 ...

  8. CodeForces 838A Binary Blocks(前缀和)题解

    题意:给你个n*m的矩阵,要求你找到一个k,k > 1,使得矩阵可以分为很多k * k的小正方形,然后进行操作把每个小正方形都变为0或1,问你怎样使操作数最小. 思路:随便暴力不可取,显然你每次 ...

  9. CodeForces - 662C Binary Table (FWT)

    题意:给一个N*M的0-1矩阵,可以进行若干次操作,每次操作将一行或一列的0和1反转,求最后能得到的最少的1的个数. 分析:本题可用FWT求解. 因为其0-1反转的特殊性且\(N\leq20\),将每 ...

随机推荐

  1. JSTL标签库笔记

    1. 概述 JSTL(Jsp Standard Tag Library)即JSP标准标签库,只能运行在支持JSP1.2↑和Servlet2.3↑规范的容器上. 通常情况下我们在编写JSP页面的时候,在 ...

  2. 56、isinstance作用以及应用场景?

    isinstance作用:来判断一个对象是否是一个已知的类型: 其第一个参数(object)为对象,第二个参数为类型名(int...)或类型名的一个列表((int,list,float)是一个列表). ...

  3. docker ubuntu容器更换阿里源(转)

    问题:使用docker 利用下载的ubuntu镜像启动容器时,使用的源下载更新软件的速度较慢. 解决这个问题的方法是跟新ubuntu容器的源 示例:以ubuntu为基础镜像 启动一个名称为 test0 ...

  4. 动态规划_01背包问题_Java实现

    原文地址:http://blog.csdn.net/ljmingcom304/article/details/50328141 本文出自:[梁敬明的博客] 1.动态规划 什么是动态规划?动态规划就是将 ...

  5. [004] last_k_node

    [Description] find the k-th node from the last node of single linked list. e.g. Linked-list: 1-2-3-4 ...

  6. shell编程===执行shell脚本的四种方法

    使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...

  7. Linux删除除了今天以外的文件

    [背景] 开发到日志记录功能时,每天都会产生当天的一个日志,久而久之就会产生累积,想要查看的时候,tab键无法自动补全,还要自己额外输入. 比较麻烦. [命令] 经过查找和实验,找到了以下的方法: 1 ...

  8. centos7安装完成后的一些配置

    1.打开终端 输入 sudo yum -y update 先更新软件包 2.这是输入语言 应用程序->系统工具->设置->区域和语言->+   ->汉语(中国)-> ...

  9. JavaSE项目之员工收录系统

    在Java SE中,对IO流与集合的操作在应用中比较重要.接下来,我以一个小型项目的形式,演示IO流.集合等知识点在实践中的运用. 该项目名称为“员工收录系统”,主要是通过输入员工的id.姓名信息,实 ...

  10. js中startWith、endWith 函数不能在任何浏览器兼容的问题

    在做js测试的时候用到了startsWith函数,但是他并不是每个浏览器都有的,所以我们一般要重写一下这个函数,具体的用法可以稍微总结一下 在有些浏览器中他是undefined 所以我们可以这样的处理 ...