Educational_round94題解

ZHAOXU333發表於2024-07-09

Educational_round94題解

A. String Similarity(構造+思維)

解題思路

原字串長度為$2*n-1$,需要匹配的字串一共有$n$個,要使所有字串都得到匹配,即讓構造的長度為$n$的字串每一個位置都能匹配到一個。可得到$w_i=s_{2i}$

題解

#include<iostream>
using namespace std;

char str[200];
char ans[200];

int main(){
	int T;
	cin >> T;
	while(T--){
		int n;
		cin >> n;
		cin >> str;
		for(int i=0;i<n;i++){
			ans[i] = str[i*2];
		}
		ans[n] = '\0';
		cout << ans << "\n";
	}
}

B. RPG Protagonist

解題思路

題解

C. Binary String Reconstruction(模擬)

解題思路

就是一個反推字串的過程。已知有一種情況是兩個條件都為假時才會出現$0$,則先利用這種情況反推出有$0$的部分。但是這並不是唯一的一種情況,當$i-x$跟$i+x$都不在範圍內的時候也為$0$,即在$\left (x,n-x\right ]$區間中的字元都為$0$。其餘情況為$1$。一共掃兩遍,第一遍確定$0$,第二遍判斷是否合理

題解

#include<bits/stdc++.h>
using namespace std;

char str[100010];
char ans[100010];

int main(){
	int t;
	int x;
	cin >> t;
	while(t--){
		cin >> str + 1;
		cin >> x;
		int n = strlen(str+1);
		for(int i=1;i<=n;i++){
			ans[i] = '1';
			if(i+x>n&&i<=x){
				ans[i] = '0';
			}
		}
		for(int i=1;i<=n;i++){
			if(str[i]=='0'){
				if(i+x<=n){
					ans[i+x] = '0';
				}
				if(i>x){
					ans[i-x] = '0';
				}
			}
		}
		ans[n+1] = '\0';
		bool flag = true;
		for(int i=1;i<=n;i++){
			if(!(str[i]=='1' && ((i+x<=n&&ans[i+x]=='1') || (i>=x&&ans[i-x]=='1'))
					|| (str[i]=='0' && ( (i+x>n && i<x) || !((i+x<=n&&ans[i+x]=='1') || (i>=x&&ans[i-x]=='1')) ) )
				)){
				flag = false;
			}
		}
		if(flag){
			cout << ans+1 <<"\n";
		}else{
			cout << "-1" << "\n";
		}

	}
}