Educational Codeforces Round 137 (Rated for Div. 2) D. Problem with Random Tests

发布于:2022-10-29 ⋅ 阅读:(278) ⋅ 点赞:(0)

 

 翻译:

给出一个由𝑛字符组成的字符串𝑠。𝑠的每个字符要么为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;
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到