CF Edu94Div2(1400)C Binary String Reconstruction

2023-10-19 15:08

本文主要是介绍CF Edu94Div2(1400)C Binary String Reconstruction,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题面

题目大意

有一个01串w,还知道一个定值x
通过这个串可以生成一个新的01串s,长度与w相同,方法如下:
(假设n是串的长度)

if (i-x>=1 && w[i-x]) s[i]=1;
else if (i+x<=n && w[i+x]) s[i]=1;
else s[i]=0;

现在知道生成的串s,求原串w,如果无解输出-1

题解

还是一道比较好想的题
观察发现,如果s[i]=0,那么w[i-x]和w[i+x]一定是0,所以可以先用这个方法把w中必须是0的位置确定下来,然后剩下的位置都是1
但是还要判断是否有解,只要用目前w再生成一次s’,判断s和s’是否相同就好了,具体的说就是:对于位置i,假如s[i]=1,那么w[i-x]或w[i+x]是1才行

代码
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
char ch[N];
int s[N],w[N];
int T,n,x;
int main(){
//	freopen("C.in","r",stdin);scanf("%d",&T);for (;T;T--){scanf("%s",ch+1);n=strlen(ch+1);scanf("%d",&x);for (int i=1;i<=n;i++){w[i]=1;s[i]=ch[i]-'0';}for (int i=1;i<=n;i++)if (!s[i]){if (i+x<=n) w[i+x]=0;if (i-x>=1) w[i-x]=0;}bool bz=1;for (int i=1;i<=n;i++)if (s[i])if (((i+x<=n && !w[i+x]) || i+x>n) && ((i-x>=1 && !w[i-x]) || i-x<1)){bz=0;break;}if (!bz) puts("-1");else{for (int i=1;i<=n;i++)printf("%d",w[i]);puts("");}}
}

这篇关于CF Edu94Div2(1400)C Binary String Reconstruction的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240591

相关文章

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

cf 164 C 费用流

给你n个任务,k个机器,n个任务的起始时间,持续时间,完成任务的获利 每个机器可以完成任何一项任务,但是同一时刻只能完成一项任务,一旦某台机器在完成某项任务时,直到任务结束,这台机器都不能去做其他任务 最后问你当获利最大时,应该安排那些机器工作,即输出方案 具体建图方法: 新建源汇S T‘ 对任务按照起始时间s按升序排序 拆点: u 向 u'连一条边 容量为 1 费用为 -c,

CF 508C

点击打开链接 import java.util.Arrays;import java.util.Scanner;public class Main {public static void main(String [] args){new Solve().run() ;} }class Solve{int bit[] = new int[608] ;int l

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

hdu2072(string的应用)

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25447    Accepted Submission(s): 5957 Problem Description lily的好朋友xiaoou333最近很空,他

【UVA】10739 - String to Palindrome(动态规划)

比较水的动态规划 dp[i][j] 将原串 i ~ j 之内的字符转化为回文字符所需要的最小操作次数 其中删除操作和添加操作本质上是一样的。 三个状态转移方程: dp[i][j] = min(dp[i][j] ,dp[i + 1][j]); dp[i][j] = min(dp[i][j] ,dp[i + 1][j - 1]); dp[i][j] = min(dp[i][j] ,dp[

【CF】C. Glass Carving(二分 + 树状数组 + 优先队列 + 数组计数)

这题简直蛋疼死。。。。。 A了一下午 #include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn = 200005;int h,w,n;int C1[maxn],C2[maxn];int

【CF】E. Anya and Cubes(双向DFS)

根据题意的话每次递归分3种情况 一共最多25个数,时间复杂度为3^25,太大了 我们可以分2次求解第一次求一半的结果,也就是25/2 = 12,记录结果 之后利用剩余的一半求结果 s-结果 = 之前记录过的结果 就可以 时间复杂度降低为 3 ^ (n/2+1) 题目链接:http://codeforces.com/contest/525/problem/E #include<set

【CF】D. Arthur and Walls(BFS + 贪心)

D题 解题思路就是每次检查2X2的方格里是否只有一个‘*’,如果有的话这个*就需要变成‘.’,利用BFS进行遍历,入队的要求是这个点为. 一开始将所有的'.'全部加入队列,如果碰到一个'*'变成'.'就入队,判断的时候从4个方向就行判断 题目链接:http://codeforces.com/contest/525/problem/D #include<cstdio>#include<