传送门

题意: 给一个二进制串aaa,让后定义两个串相似为有至少一个相同位置相等。现在让你找一个字典序最小的长度为kkk的串使其与aaa中每个长度为kkk的字串相似。

思路: 首先我们知道所有可能的串一共有2k2^k2k,我们把aaa串全部取反,这样aaa的所有长度为kkk的串都是不符合条件的,除去这n−k+1n-k+1n−k+1个串,其他的串都是符合条件的,那么我们从000开始枚举到n−k+1n-k+1n−k+1转换成二进制一定可以找到一个符合条件的串。但是我们不一定有n−k+1n-k+1n−k+1个,上限为2k2^{k}2k个情况,二者取min即可。如果到最后都没找到那说明不存在。
二进制串的话整个哈希就好了,能很快的得到hash值,白嫖lc哥的板子。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<LL,LL> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int k,n;
int a[N],ans,tot;
LL now1,now2;
char ss[N];
map<LL,int>mp1,mp2;struct Hash
{char s[N];LL hash[N][2],base[2],mod[2],f[N][2],ban;int n;void init(int id){ban=id;base[0]=233333;base[1]=23333333;mod[0]=1e9+7;mod[1]=1e9+9;for(int k=0;k<2;k++){hash[0][k]=0;f[0][k]=1;for(int i=1;i<=n;i++){f[i][k]=f[i-1][k]*base[k]%mod[k];hash[i][k]=(hash[i-1][k]*base[k]+s[i])%mod[k];}}}pair<LL,LL>get_hash(int l,int r){if(l<=0||r>n) return make_pair(ban,ban);return make_pair((hash[r][0]-hash[l-1][0]*f[r-l+1][0]%mod[0]+mod[0])%mod[0],(hash[r][1]-hash[l-1][1]*f[r-l+1][1]%mod[1]+mod[1])%mod[1]);}
}s,t;void get(int ans)
{string ss;while(ans) ss+=ans%2+'0',ans/=2;while(ss.size()<k) ss+='0';now1=now2=0;for(int i=ss.length()-1;i>=0;i--) now1=(now1*s.base[0]+ss[i])%s.mod[0],now2=(now2*s.base[1]+ss[i])%s.mod[1];
}bool check()
{for(int i=0;i<=min(n-k+1,(1<<(min(26,k)))-1);i++){get(i);if(mp1[now1]||mp2[now2]) continue;ans=i;return true;}return false;
}string solve()
{string s;while(ans) s+=ans%2+'0',ans/=2;while(s.size()<k) s+='0';reverse(s.begin(),s.end());return s;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int _; scanf("%d",&_);while(_--){scanf("%d%d",&n,&k); scanf("%s",s.s+1); s.n=n;for(int i=1;i<=n;i++) s.s[i]=((s.s[i]-'0')^1)+'0';s.init(1); mp1.clear(); mp2.clear();for(int i=k;i<=n;i++){PII t=s.get_hash(i-k+1,i);mp1[t.X]=1; mp2[t.Y]=1;}if(check()) printf("YES\n%s\n",solve().c_str());else printf("NO\n");}return 0;
}
/**/

Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞相关推荐

  1. Educational Codeforces Round 73 (Rated for Div. 2) F. Choose a Square 线段树 + 二维转一维

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点(xi,yi)(x_i,y_i)(xi​,yi​),每个点有个价值cic_ici​,现在你可以框一个正方形,要求左下角和右上角的坐标(x,y)( ...

  2. Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索

    传送门 文章目录 题意: 思路: 题意: 思路: 一个显然的思路就是2302^{30}230枚举所有的xxx,让后再检查,这个复杂度显然不能接受. 又发现对于每个位置它取多少不受其他位置限制,满足可拼 ...

  3. Educational Codeforces Round 101 (Rated for Div. 2) C. Building a Fence 思维取范围

    传送门 题意: 思路: 刚看到这个题其实是没什么思路,想过从前往后推或者从后往前推,但是都不是很可行.因为两边都有一个固定的挡板挡住,我们可以根据其中的一个算出来每个位置高度的范围,让后检查一下范围是 ...

  4. Educational Codeforces Round 101 (Rated for Div. 2) D. Ceil Divisions 思维 + 根号数

    传送门 题意: 给一个数组ai=ia_i=iai​=i,每次可以进行操作ax=⌈axay⌉a_x=\left \lceil \frac{a_x}{a_y} \right \rceilax​=⌈ay​a ...

  5. Educational Codeforces Round 101 (Rated for Div. 2) D. Ceil Divisions(思维)

    给出数 n ,数组 a 为 {1,2,3,--n},最多有 n+5 次机会,将任意两个不相等的数做  ceil(x/y) 运算,使得最后的数组 a 只有一个 2,其余全为 1,给出运算次数具体的运算步 ...

  6. Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

    cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai​在[li,ri][l_i,r_i][li​,ri​]等概率随机选一个数,求aaa数组不增的概率. 思 ...

  7. Educational Codeforces Round 87 (Rated for Div. 2) F. Summoning Minions

    题目链接 Polycarp plays a computer game. In this game, the players summon armies of magical minions, whi ...

  8. Educational Codeforces Round 41 (Rated for Div. 2) F. k-substrings

    F. k-substrings time limit per test 4 seconds memory limit per test 256 megabytes input standard inp ...

  9. Educational Codeforces Round 126 (Rated for Div. 2)(A-E)

    A-Array Balancing 题意:给定两个数组a,b,a数组第i个数可以和b数组的第i个数交换,最终求 a1−a2|+|a2−a3|+⋯+|an−1−an||a1−a2|+|a2−a3|+⋯+ ...

最新文章

  1. windows 系统常用操作
  2. 刻意练习:LeetCode实战 -- Task02. 删除排序数组中的重复项
  3. MPB:中科院城环所杨军组-​​淡水浮游动物的采集及鉴定
  4. 马斯克的脑机接口公司Neuralink最新进展:让猴子也玩游戏
  5. Tomcat7.0安装配置
  6. jenkins pipeline发送邮件报错解决办法: failed to connect, no password specified?
  7. graphpad数据小数点_GraphPad Prism 统计指南 | 关于异常值(Outlier),你真的了解吗?...
  8. 电路理论与linkage Mapper的安装
  9. C语言骚操作:结构体初始化方法
  10. puppet报告系统 dashboard
  11. 红帽linux企业版6的进程,红帽企业版 Linux 6 设备映射多路径
  12. jedis操作set_使用 JedisAPI 操作 Redis
  13. 【转载】三角形测试用例
  14. 数据提取软件----GetData
  15. java欢迎来到宠物店,用JAVA语言实现简易的宠物店程序暨寒假集训心得
  16. c语言布尔变量逻辑运算,在C ++中对布尔值使用按位运算符
  17. “假努力”与“假关心”
  18. 天下大事做于细,从零实施ERP
  19. 视频音轨音量是否为0检测过程
  20. STM8S103之tim1PWM输出

热门文章

  1. 各种震撼的慢镜头,奇怪的知识又增加了!​
  2. 为什么盯一个字看久了,反而感觉不认识了?
  3. Spark ML - 协同过滤
  4. python3 csv读写_在python3中读取、更新和写入更新的CSV文件
  5. python 绘制围棋棋盘_围棋之规则基础(一)
  6. linux怎么搜索特定文件夹,linux如何在特定文件夹中查找特定文件
  7. 10 邮件槽_员工主动发离职邮件,提出申请又反悔,法院判决让人懵了!
  8. 香肠派对电脑版_香肠派对先行服s7赛季下载-香肠派对先行服s7赛季最新版下载...
  9. 后端返回number类型数据_Javascript基础教程之数据类型 (数值 Number)
  10. 吴恩达DeepLearningCourse5-序列模型