列表

详情


NC23801. DongDong破密码

描述

DongDong是一个喜欢密码学的女孩子,她养的萨摩耶叼着一张带着加密信息的纸条交给了她,如果她不能破解这张密码,萨摩耶是不会高兴的。

给定n,m,给出长度为n01串,每次向后移动一位,移动m-1次,最后求出这n+m-1位每一位的异或值(0^0=0,1^1=0,0^1=1)成为密码。(如下图这样,此时n=6,m=3)


输入描述

第一行两个整数,n和m

第二行一个01串(共n+m-1位)

2<=n+m<=1000000

输出描述

第一行输出答案:长度为n的01串(保证存在答案)

示例1

输入:

6 3
11010110

输出:

101010

说明:

见题目描述

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 157ms, 内存消耗: 8416K, 提交时间: 2019-06-07 21:04:29

#include<stdio.h>
int n,m,a[1000006],i,b[1000006],j;
int main()
{
	scanf("%d%d",&n,&m);
	for(i=0;i<m+n-1;i++)
	scanf("%1d",&a[i]);
	b[0]=a[0];
	for(i=1;i<n;i++)
	{
		b[i]=a[i];
		b[i]^=a[i-1];
		if(i-m>=0)
		b[i]^=b[i-m];
	}
	for(i=0;i<n;i++)
	printf("%d",b[i]);
}

Python3(3.5.2) 解法, 执行用时: 1003ms, 内存消耗: 74312K, 提交时间: 2019-06-07 23:13:43

n,m=map(int,input().split())
strin=list(map(int,input()))
ret=[0 for i in range(n)]
ret[0]=strin[0]
for i in range(1,n) :
    if i<m:
        ret[i]=strin[i-1]^strin[i]
    else :
        ret[i]=strin[i-1]^strin[i]^ret[i-m]
print(''.join(map(str,ret)))
        

C++11(clang++ 3.9) 解法, 执行用时: 67ms, 内存消耗: 5704K, 提交时间: 2019-06-07 21:32:35

#include<bits/stdc++.h>
int n,m,a[2000005],i,j;
std::string s;
int main()
{
	std::cin>>n>>m>>s;
	for(i=0;i<n;i++)a[i]=s[i]==49^s[i-1]==49,i>=m&&(a[i]^=a[i-m]),putchar(a[i]+48);
}

上一题