Submission #900076

#TimeUsernameProblemLanguageResultExecution timeMemory
900076weajinkAncient Machine 2 (JOI23_ancient2)C++17
100 / 100
32 ms2176 KiB
#include "ancient2.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//Autor: Michał Szeliga
#ifdef LOCAL
#define debug(...) __VA_ARGS__;
#else
#define debug(...) {}
#endif
#define read(...) debug((void)!freopen(__VA_ARGS__,"r",stdin););
 
const int M = 1001;
bitset<M> akt[M-1];
int ile = 0;
int gauss(bitset<M> x){
	int i;
	for (i = 0; i < M-1; i++){
		if (x[i]){
			if (!akt[i][i]){
				//cout<<i<<" # "<<x<<"\n";
				akt[i] = x;
				ile++;
				return i;
			}
			x ^= akt[i];
		}
	}
	return -1;
}
bool policz(int x){
	bitset<M> wy;
	wy[x] = 1;
	for (int i = 0; i < M-1; i++){
		if (wy[i]) wy ^= akt[i];
	}
	return wy[M-1];
}
void stworz_automat(int c, int r){
	bitset<M> wy;
	for (int i = r; i < M-1; i += c) wy[i] = 1;
	int id = gauss(wy);
	if (id != -1){
		int m = 2*c;
		vector<int> A,B;
		for (int i = 0; i < c; i++){
			if (i%c == r){
				A.push_back((r+1)%c);
				B.push_back(c+(r+1)%c);
			}else{
				A.push_back((i+1)%c);
				B.push_back((i+1)%c);
			}
		}
		for (int i = c; i < 2*c; i++){
			if (i%c == r){
				A.push_back(c+(r+1)%c);
				B.push_back((r+1)%c);
			}else{
				A.push_back(c+(i+1)%c);
				B.push_back(c+(i+1)%c);
			}
		}
		/*cout<<"Zapytanie o "<<c<<" "<<r<<"\n";
		for (int j = 0; j < m; j++){
			cout<<A[j]<<" "<<B[j]<<"\n";
		}*/
		akt[id][M-1] = akt[id][M-1]^(Query(m,A,B) >= c);
		//cout<<id<<" "<<akt[id]<<"\n";
	}
}
void stworz_automat2(int k){
	bitset<M> wy;
	wy[k] = 1;
	vector<int> A,B;
	for (int i = 0; i < k; i++){
		A.push_back(i+1);
		B.push_back(i+1);
	}
	A.push_back(k+1);
	B.push_back(k+2);
	A.push_back(k+1);
	B.push_back(k+1);
	A.push_back(k+2);
	B.push_back(k+2);
	wy[M-1] = (Query(k+3,A,B) > k+1);
	gauss(wy);
}
string sufiks;
void stworz_automat3(int k){
	bitset<M> wy;
	wy[M-k-1] = 1;
	sufiks = '0'+sufiks;
	string s = '#'+sufiks+'$'+sufiks;
//	cout<<s<<"\n";
	int n = s.size();
	int P[n+1];
	P[1] = 0;
	for (int i = 2; i < n; i++){
		int os = P[i-1];
		while (os && s[os+1] != s[i]){
			os = P[os];
		}
		if (s[os+1] == s[i]) os++;
		P[i] = os;
		//cout<<i<<" "<<P[i]<<"\n";
	} 
	vector<int> A,B;
//	cout<<k+1<<"\n";
	for (int i = 0; i < k+1; i++){
		if (i == k || sufiks[i] == '1'){
			int os = P[i+sufiks.size()+1];
			while (os && s[os+1] != '0'){
				os = P[os];
			}
			if (s[os+1] == '0') os++;
			A.push_back(os);
		}
		if (i == k || sufiks[i] == '0'){
			int os = P[i+sufiks.size()+1];
			while (os && s[os+1] != '1'){
				os = P[os];
			}
			if (s[os+1] == '1') os++;
			B.push_back(os);
		}
		if (A.size() < B.size()) A.push_back(i+1);
		if (B.size() < A.size()) B.push_back(i+1);
		//cout<<A.back()<<" "<<B.back()<<"\n";
	}
	//exit(0);
	int x = Query(k+1,A,B);
	//cout<<x<<" "<<k<<"\n";
	wy[M-1] = (x!=k);
	//if (k == 4) exit(0);
	if (wy[M-1] == 1) sufiks[0] = '1';
	gauss(wy);
}
string Solve(int n){
	for (int i = 0; i < 100; i++) stworz_automat2(i);
	for (int i = 1; i <= 100; i++) stworz_automat3(i);
	for (int c = 1; c < M-1; c++){
		for (int r = 0; r < c; r++){
			stworz_automat(c,r);
			if (ile == M-1) break;
		}
	} 
	string wy;
	for (int i = 0; i < n; i++){
		if (policz(i)) wy += '1';
		else wy += '0';
	}
	return wy;
}
#Verdict Execution timeMemoryGrader output
Fetching results...