QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#874203 | #5434. Binary Substrings | ucup-team052 | RE | 10ms | 77392kb | C++23 | 4.8kb | 2025-01-27 20:31:51 | 2025-01-27 20:32:00 |
Judging History
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;
}
詳細信息
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