其他分享
首页 > 其他分享> > DongDong破密码

DongDong破密码

作者:互联网

链接:https://ac.nowcoder.com/acm/contest/11691/A
来源:牛客网

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

给定n,m,给出长度为n的01串,每次向后移动一位,移动m-1次,最后求出这n+m-1位每一位的异或值(00=0,11=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
说明
见题目描述

我们通过观察可以发现每个值是他下面的值异或得到的,于是我们就开始找是哪些值,于是我想到了拿一个队列保存哪些数,后面的时候,一直维持那么多个数在队列中,进来一个弹出一个,但是这样的话会超时,于是我们可以用一个数来维持那个数,每次再异或上将要弹出去的那个数即可

防止胡乱输出,我们每次只需要输出得是n个数

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <string>
#include <queue>
#include <map>
#include <stack>
#include <map>
#include <unordered_map>
#include <vector>
#include <cmath>
//#include <ext/rope>
#include <bits/stdc++.h> 

using namespace std;

#define gt(x) x = read()
#define int  long long
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
//#define x first
//#define y second

//int dx[4] = {0, 1, 0, -1};
//int dy[4] = {1, 0, -1, 0}; 

//typedef __int128 INT;
typedef pair<double, int> PDI;
typedef pair<int, int> PII;
typedef unsigned long long ULL;

inline int read(int out = 0)
{
    char c;
    while((c=getchar()) < 48 || c > 57);
    while(c >= 48 && c <= 57) out=out*10+c-48,c=getchar();
    return out; 
}

const int N = 2e6 + 10;
const int M = 2e7 + 10;
const int mod = 1e9 + 7;
const int PP = 13331;
const int inf = 0x3f3f3f3f;
const int INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-10;
const double PI = acos(-1);

int ans[N];

signed main(){
	int n, m;
	string str;
	scanf("%lld%lld", &n, &m);
	cin >> str;
	
	if (m == 0){
		cout << str << endl;
	}
	else if (n == 0){
	//	cout << endl;
	}
	else{
	ans[0] = (str[0] - '0');
//	cout << ans[0];
	int last = (str[0] - '0');
	
	for (int i = 1; i <= m - 2; i ++){
		 ans[i] = ((str[i] - '0'));
		ans[i] ^= last;
	//	cout << ans[i];
		last ^= ans[i];
	}
	
	for (int i = m - 1; i <= n - 1 ; i ++){
		 ans[i] = (str[i] - '0');
		ans[i] ^= last;
	//	cout << ans[i];
		last ^= ans[i];
		last ^= (ans[i - m + 1]);
	}
	
	for (int i = 0; i < n; i ++)   cout << ans[i];
	
	cout << endl;
	}

	
	return 0;
}

标签:DongDong,cout,int,密码,str,ans,include,define
来源: https://blog.csdn.net/qq_45772483/article/details/113186458