Educational Codeforces Round 137 D
D. Problem with Random Tests
显然对于一个本串 我们可以抹去前面的0 根本没用
其次我们为了位数最大化 让s1=本串
然后我们考虑如何将s1后面的0补齐
我们设第一位0位置是p0
显然我们的只能让p0前面的子串来补齐这个位置
因为我们子串长度为n-p0 我们每次左移一位就相当于让这个区间左移了1
前面就只有1 因为题意随机化 我们1/2^50即可
所以我们对本串左移50次 每次求or 更新答案即可
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
const int M = 998244353;
const int mod = 1e9+7;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
string erasezeros(string s){
int first = 0;
while(s[first] == '0' && first < s.length() - 1) first ++;
return s.substr(first);
}
void solve(){
int n;string s;cin>>n>>s;
s = erasezeros(s);
bitset<N>b1(s),b2(s);
string ans=b1.to_string();
for(int i=1;i<=50;i++)
ans=max(ans,(b1|(b2>>i)).to_string());
cout<<erasezeros(ans);
}
signed main(){
fast
int t;t=1;//cin>>t;
while(t--) {
solve();
}
return ~~(0^_^0);
}