Submission #287145

#TimeUsernameProblemLanguageResultExecution timeMemory
287145crossing0verPassword (RMI18_password)C++17
100 / 100
302 ms744 KiB
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
using namespace std;
 
int m;
string suf,pref;
int query(string str);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
vector<string> sub(27);
int par[27];
int PAR(int x) {
	if (par[x] == x) return x;
	return PAR(par[x]);
}
void removeF(string &s){
	reverse(all(s));
	if (s.size())
	s.pop_back();
	reverse(all(s));
	return;
}
set<pii> H;
void join(int x,int y) {
	x = PAR(x), y = PAR(y);
	if (sub[x].size() > sub[y].size())
		swap(x,y);
	par[x] = y;
	int tot = sub[x].size() + sub[y].size();
	string pref;
	int cur = sub[y].size();
	H.erase({(int)sub[x].size(),x});
	H.erase({(int)sub[y].size(),y});
	for (int i = 0;pref.size() < tot && i < sub[x].size(); i++) {
		string P = pref + sub[x][i];
		P += sub[y];
		//int F;
		int F = query(P);
		if (F > cur) {
			pref += sub[x][i];
			cur = F;
		}else {
			if (sub[y].size()) {
			pref += sub[y][0];
			removeF(sub[y]);
			i--;
		}
		}
	}
	H.insert({tot,y});
	sub[y] = pref + sub[y];
//	if (query(sub[y]) != (int)sub[y].size() || (int)sub[y].size() != tot)
	//	while(true) {
			
	//	}
}
string guess(int n, int s) {
	string pref,P;
	for (int i = 0;i < s; i++) {
		par[i] = i;
		for (int j = 0; j < n; j++)
		P+=('a'+ i);
		//int x;
		int x = query(P);
		P.clear();
		for (int j = 0; j < x; j++)
			P+=('a' + i);
		sub[i] = P;
		P.clear();
	}
	for (int i  = 0; i < s; i++) {
		H.insert({sub[i].size(),i});
	}
	while (H.size() >= 2) {
		auto it = H.begin();
	int  x = it->se;
	it++;
	int y = it->se;
	join(x,y);
	}
	int x = PAR(H.begin()->se);
	query(sub[x]);
	return sub[x];
	vector<char> D;
	for (char i = 'a'; i < 'a' + s ; i++)
		D.pb(i);
	shuffle(all(D),rng);
	map<char,int> mp;
	for (int i = 0;i < s; i++) mp[D[i]] = i;
	char fs = 'a';
	for (; pref.size() + suf.size() < n; ) {
		int len = suf.size() + pref.size();
		char LAST = ((int)pref.size() ? pref.back() : 'a');
		int cur = len;
//		vector<char> D = T;
		for (int z = 1; z + pref.size() + suf.size() <= n;) {
			bool flag = 0;
			vector<char> Q;
		//	shuffle(D.begin(),D.end(),rng);
		for (int  b= max((pref.size() ? mp[pref.back()] : 0),(suf.size() ? mp[suf[0]] : 0)); b < s; b++){
			char c = D[b];
	///	for (char c : D) {
			P = pref + c;
			P += suf;
			int F = query(P);
			if (F > cur) {
				LAST = c;
				pref += c;
				cur = F;
				flag  = 1;
				break;
			}
		//	else Q.pb(c);
		}
	//	for (char c :  Q) D.erase(find(all(D),c));
		if (flag == 0) break;
		}
		reverse(all(suf));
		if (pref.size())
		suf+=pref.back();
		reverse(all(suf));
		if (pref.size())
		pref.pop_back();
		if (pref.size() + suf.size() == n) {
			pref += suf;
			int Z = query(pref);
			return pref;
		}
	}
	pref += suf;
	int z = query(pref);
	return pref;
}
/*
main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
 
}*/

Compilation message (stderr)

password.cpp: In function 'void join(int, int)':
password.cpp:39:29: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   39 |  for (int i = 0;pref.size() < tot && i < sub[x].size(); i++) {
      |                 ~~~~~~~~~~~~^~~~~
password.cpp:39:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |  for (int i = 0;pref.size() < tot && i < sub[x].size(); i++) {
      |                                      ~~^~~~~~~~~~~~~~~
password.cpp: In function 'std::string guess(int, int)':
password.cpp:96:34: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   96 |  for (; pref.size() + suf.size() < n; ) {
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~^~~
password.cpp:101:48: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  101 |   for (int z = 1; z + pref.size() + suf.size() <= n;) {
      |                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
password.cpp:129:32: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  129 |   if (pref.size() + suf.size() == n) {
      |       ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
password.cpp:131:8: warning: unused variable 'Z' [-Wunused-variable]
  131 |    int Z = query(pref);
      |        ^
password.cpp:98:8: warning: variable 'LAST' set but not used [-Wunused-but-set-variable]
   98 |   char LAST = ((int)pref.size() ? pref.back() : 'a');
      |        ^~~~
password.cpp:95:7: warning: unused variable 'fs' [-Wunused-variable]
   95 |  char fs = 'a';
      |       ^~
password.cpp:136:6: warning: unused variable 'z' [-Wunused-variable]
  136 |  int z = query(pref);
      |      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...