D. Problem with Random Tests

传送门

题意:
给出一个字符串,然后,从这个字符串中取两个子串s1, s2,要求两个字符串的或最大


思路:
首先,先去s1从第一个非0开始取整段,记录第一个非0的位置为p1, 因为或位数越多越好,然后对于s2, s2的作用就是尽可能的取满足s1中0的位置,然后考虑s1中第一个为0的数,记录为p2, 要让这个数变为1,这个1只能从前面取, 因为后面的长度是不够的,所以只要枚举从p1 ~ p2 - 1为开始端,然后长度为n - p2即可,然后对于这个实现有两点,字符串如果为01类型的字符串可以直接或,异或,与操作,然后max函数也可以直接作用于字符串


总结:
字符串如果为01类型可以直接用位运算,max函数可以直接作用于字符串,substr(开始生成位置(默认为0), 生成的长度(默认到尾端))

点击查看代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);
#define endl '\n'
using namespace std;

typedef long long ll;

int n;
string s;

int main()
{
    IOS; cin.tie(0), cout.tie(0);
    cin >> n;
    cin >> s;
    int p1 = s.find('1');
    if (p1 == -1)
        cout << "0" << endl, exit(0);
    int p2 = s.find('0', p1);
    string ret = s;
    for (int i = p1; i < p2; ++i)
    {
        string t = s;
        for (int j = i + n - p2 - 1, k = n - 1; j >= i; --j, --k)
            t[k] |= s[j];   
        ret = max(ret, t);    
    }
    cout << ret.substr(ret.find('1')) << endl;
    return 0;
}

posted @   YUGUOTIANQING  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示