翻译:
给出一个由𝑛字符组成的字符串𝑠。𝑠的每个字符要么为0,要么为1。
𝑠的子字符串是其字符的连续子序列。
您必须选择𝑠的两个子字符串(可能相交,可能相同,可能不相交——只是任意两个子字符串)。选择它们之后,计算所选子串的值如下:
让𝑠1是第一个子串,𝑠2是第二个被选择的子串,𝑓(𝑠𝑖)是一个整数,以便𝑠𝑖是它的二进制表示形式(例如,如果𝑠𝑖是11010,𝑓(𝑠𝑖)=26);
取值为𝑓(𝑠1)和𝑓(𝑠2)的或位。
计算你能得到的最大可能值,并打印成二进制表示,不带前导零。
输入
第一行包含一个整数𝑛—𝑠中的字符数。
第二行包含𝑠本身,正好由𝑛字符0和/或1组成。
本问题中的所有非例测试都是随机生成的:𝑠的每个字符都是独立于其他字符选择的;对于每个字符,它是1的概率恰好是12。
这个问题有40个测试。从1到3的测试是示例;从4到40的测试是随机生成的。在4到10的测试中,𝑛=5;在从11到20的测试中,𝑛=1000;在21到40的测试中,𝑛=106。
在这个问题中禁止黑客攻击。
输出
打印不带前导零的二进制表示的最大可能值。
例子
inputCopy
5
11010
outputCopy
11111
inputCopy
7
1110010
outputCopy
1111110
inputCopy
4
0000
outputCopy
0
请注意
在第一个示例中,可以选择子字符串11010和101。𝑓(𝑠1)=26,𝑓(𝑠2)=5,它们的位或为31,31的二进制表示为11111。
在第二个示例中,可以选择子字符串1110010和11100。
题意:两串字符串或运算,然后转为二进制,得到数字最大值。
思路:最大值,所以一个串一定为原串,另一个串是用来或运算,或运算最大,前边的0,变为1的时候依次往后推,可以得到最大值。然后可以直接暴力求解。
代码实现:
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
using namespace::std;
typedef long long ll;
int n;
int bj=-1;
int bj2=-1;
string s;
bool cmp(string a,string b){
return a>b;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(); cout.tie();
cin>>n>>s;
vector<string>q;
for (int i =0; i<n; i++) {
if (s[i]=='1'&&bj==-1) {
bj=i;
}
if (bj!=-1&&s[i]=='0') {
bj2=i;
break;
}
}
// printf("%d %d\n",bj,bj2);
if (bj==-1) {
printf("0\n");return 0;
}
string ds="";
for (int i =bj; i<bj2; i++) {
ds="";
if (s[i]=='1') {
int sl=i;
for (int j = bj2; j<n; j++,sl++) {
if (s[sl]=='1'||s[j]=='1') {
ds+='1';
}
else{
ds+='0';
}
}
q.push_back(ds);
}
}
sort(q.begin(), q.end(), cmp);
int jk=0;
for (int i =0; i<bj2; i++) {
if (s[i]=='0'&&!jk) {
continue;
}else{
jk=1;
}
cout<<s[i];
}
cout<<q[0]<<"\n";
// 33
printf("%d %d\n",bj,bj2);
int lk=0;
for (int i =0; i<n; i++) {
if (i>=bj2) {
if (s[i]=='1'||s[bj]=='1') {
printf("1");
lk=1;
}
else{
if (i==n-1&&!lk) {
printf("0");continue;
}
if (!lk) {
continue;
}
printf("0");
}
bj++;
continue;
}
if (s[i]=='1') {
lk=1;
}
if (i==n-1&&!lk) {
printf("0");continue;
}
if (!lk) {
continue;
}
printf("%c",s[i]);
}printf("\n");
return 0;
}