QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#874203#5434. Binary Substringsucup-team052RE 10ms77392kbC++234.8kb2025-01-27 20:31:512025-01-27 20:32:00

Judging History

你现在查看的是最新测评结果

  • [2025-01-27 20:32:00]
  • 评测
  • 测评结果:RE
  • 用时:10ms
  • 内存:77392kb
  • [2025-01-27 20:31:51]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define Fast_IO ios::sync_with_stdio(false);
#define DEBUG fprintf(stderr,"Running on Line %d in Function %s\n",__LINE__,__FUNCTION__)
//mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
#define fir first
#define sec second
#define mod 998244353
#define ll long long
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
inline int read()
{
	char ch=getchar(); int nega=1; while(!isdigit(ch)) {if(ch=='-') nega=-1; ch=getchar();}
	int ans=0; while(isdigit(ch)) {ans=ans*10+ch-48;ch=getchar();}
	if(nega==-1) return -ans;
	return ans;
}
typedef pair<int,int> pii;
void print(vector<int> x){for(int i=0;i<(int)x.size();i++) printf("%d%c",x[i]," \n"[i==(int)x.size()-1]);}
inline int min(int x,int y,int z){return min(x,min(y,z));}
inline int max(int x,int y,int z){return max(x,max(y,z));}
#define N 2000005
int n,m,len,cur,pw[30];
namespace N1
{
	struct Edge{int v,nxt;};
	Edge edge[N];
	int fir[N],ss,ans[N],vis[N],cnt;
	void add(int u,int v) {edge[++ss]=(Edge){v,fir[u]}; fir[u]=ss;}
	void dfs(int u)
	{
		for(int i=fir[u];i!=0;i=fir[u])
		{
			for(;vis[i]&&i;i=edge[i].nxt);
			fir[u]=i;
			if(i) vis[i]=1,dfs(edge[i].v),ans[++cnt]=edge[i].v;
		}
	}
	vector<int> get(vector<pii> G)
	{
		int n=0; ss=cnt=0; for(auto [u,v]:G) n=max(n,u,v);
		for(int i=1;i<=n;i++) fir[i]=0;
		for(int i=1;i<=(int)G.size();i++) vis[i]=0;
		for(auto [u,v]:G) add(u,v);
		dfs(G[0].fir); reverse(ans+1,ans+cnt+1); ans[cnt+1]=ans[1];
		vector<int> r(cnt+1);
		for(int i=0;i<=cnt;i++) r[i]=ans[i+1];
		return r;
	}
};
string str[N];
int cnt,tar;
void dfs1(int dep,string cur)
{
	if(dep==tar) return str[++cnt]=cur,void();
	for(int i=0;i<m;i++) dfs1(dep+1,cur+(char)('a'+i));
}
string getans(int k)
{
	if(k==1)
	{
		string ans;
		for(int i=0;i<m;i++) ans+=(char)('a'+i);
		return ans;
	}
	for(int i=1;i<=pw[k-1];i++) str[i].clear();
	cnt=0,tar=k,dfs1(1,"");
	vector<pii> G;
	for(int i=1;i<=pw[k-1];i++)
	{
		string tmp=str[i].substr(1,k-1);
		for(int j=0;j<m;j++)
		{
			tmp+=(char)('a'+j);
			G.eb(i,lower_bound(str+1,str+pw[k-1]+1,tmp)-str);
			tmp.pop_back();
		}
	}
	vector<int> ep=N1::get(G);
	string ans=str[ep[0]];
	for(int i=1;i<(int)ep.size();i++) ans+=str[ep[i]].back();
	return ans;
}
int ban[N];
inline int getid(string arr[],int len,string s) {return lower_bound(arr+1,arr+len+1,s)-arr;}
vector<vector<int>> chain[N/20+5];
int fa[N];
int find(int u) {return fa[u]==u?u:fa[u]=find(fa[u]);}
signed main()
{
	cin>>n;
	m=2;
	if(m==1)
	{
		for(int i=1;i<=n;i++) putchar('0');
		return 0;
	}
	if(n<=m)
	{
		for(int i=0;i<n;i++) putchar('0'+i);
		return 0;
	}
	len=0,cur=1;
	while(cur+len-1<n) len++,cur*=m;
	pw[0]=1; for(int i=1;i<=len;i++) pw[i]=pw[i-1]*m;
	cur+=len-1;
	if(cur==n)
	{
		string ans=getans(len);
		// cout<<ans<<endl;
		for(int i=0;i<(int)ans.size();i++) putchar(ans[i]-'a'+'0');
		return 0;
	}
	string res=getans(len-1);
	for(int i=1;i<=pw[len];i++) str[i].clear();
	cnt=0,tar=len,dfs1(1,"");
	vector<int> ep;
	ep.pb(getid(str,pw[len-1],res.substr(0,len-1)));
	for(int i=1;i+len-1<=(int)res.size();i++) ep.pb(getid(str,pw[len-1],res.substr(i,len-1)));
	for(int i=0;i<(int)ep.size()-1;i++) ban[ep[i]]=ep[i+1];
	ban[ep.back()]=ep[0];
	int cur=res.length()+1;
	vector<pii> G;
	for(int i=1;i<=pw[len-1];i++)
	{
		string tmp=str[i].substr(1,len-1);
		for(int j=0;j<m;j++)
		{
			tmp+=(char)('a'+j); int v=lower_bound(str+1,str+pw[len-1]+1,tmp)-str;
			if(ban[i]!=v) G.eb(i,v);
			tmp.pop_back();
		}
	}
	for(int i=1;i<=pw[len-1];i++) fa[i]=i;
	for(auto [u,v]:G) fa[find(u)]=find(v);
	for(int i=1;i<=pw[len-1];i++)
	{
		if(find(i)!=i) continue;
		vector<pii> H; for(auto [u,v]:G) if(find(u)==i) H.eb(u,v);
		vector<int> tmp=N1::get(H);
		if(cur+(int)H.size()>=n)
		{
			int u=tmp[0],beg=-1;
			for(int i=0;i<(int)ep.size();i++) if(ep[i]==u) {beg=i; break;}
			if(beg==-1) return 3;
			string ans=str[ep[beg]];
			for(auto ch:chain[ep[beg]])
			{
				for(int i=1;i<(int)ch.size();i++) ans+=str[ch[i]].back();
			}
			chain[ep[beg]].clear();
			for(int i=beg+1;i<(int)ep.size();i++)
			{
				ans+=str[ep[i]].back();
				for(auto ch:chain[ep[i]])
				{
					for(int i=1;i<(int)ch.size();i++) ans+=str[ch[i]].back();
				}
				chain[ep[i]].clear();
			}
			for(int i=0;i<=beg;i++)
			{
				ans+=str[ep[i]].back();
				for(auto ch:chain[ep[i]])
				{
					for(int i=1;i<(int)ch.size();i++) ans+=str[ch[i]].back();
				}
				chain[ep[i]].clear();
			}
			for(int i=1;i<(int)tmp.size()&&(int)ans.length()<n;i++) ans+=str[tmp[i]].back();
			// cout<<ans<<endl;
			for(int i=0;i<(int)ans.size();i++) putchar(ans[i]-'a'+'0');
			return 0;
		}
		chain[tmp[0]].pb(tmp);
		cur+=(int)H.size();
	}
	assert(0);
	return 0;
}




Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 6ms
memory: 69192kb

input:

2

output:

01

result:

ok meet maximum 3

Test #2:

score: 0
Accepted
time: 6ms
memory: 75340kb

input:

5

output:

11001

result:

ok meet maximum 12

Test #3:

score: 0
Accepted
time: 8ms
memory: 69192kb

input:

1

output:

0

result:

ok meet maximum 1

Test #4:

score: 0
Accepted
time: 7ms
memory: 75340kb

input:

3

output:

010

result:

ok meet maximum 5

Test #5:

score: 0
Accepted
time: 6ms
memory: 75344kb

input:

4

output:

0100

result:

ok meet maximum 8

Test #6:

score: 0
Accepted
time: 5ms
memory: 75344kb

input:

6

output:

001100

result:

ok meet maximum 16

Test #7:

score: 0
Accepted
time: 5ms
memory: 77392kb

input:

7

output:

0011000

result:

ok meet maximum 21

Test #8:

score: 0
Accepted
time: 8ms
memory: 77392kb

input:

8

output:

10001101

result:

ok meet maximum 27

Test #9:

score: 0
Accepted
time: 8ms
memory: 77388kb

input:

9

output:

100011010

result:

ok meet maximum 34

Test #10:

score: 0
Accepted
time: 7ms
memory: 75344kb

input:

10

output:

0111010001

result:

ok meet maximum 42

Test #11:

score: 0
Accepted
time: 10ms
memory: 75344kb

input:

11

output:

00011101000

result:

ok meet maximum 50

Test #12:

score: 0
Accepted
time: 8ms
memory: 75340kb

input:

12

output:

000111010000

result:

ok meet maximum 59

Test #13:

score: -100
Runtime Error

input:

200000

output:


result: