ACwing寒假每日一题2022打卡 Day 7

本文介绍了ACwing寒假每日一题的第7天题目——1996. 打乱字母。解题关键在于利用字符串排序和二分查找。通过将字符和字符串视为整数进行处理,可以简化问题,实现整数二分的解法。文中提供了作者的解题代码,并强调了字典序的处理细节。
摘要由CSDN通过智能技术生成

原题链接:

1996. 打乱字母 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/1998/

思路:

字符串排序+二分。本题需要的前置知识:sort可以直接排序字符串,按每个字符的字典序排序,sort也可以排序字符串数组,按每个字符串的字典序排序

了解了以上语法,就把这道题当成整数二分去做就行,把字符和字符串都看成整数,这题就十分清晰了。注意整数二分的两者靠拢模式,本题字典序小的应该尽量往左,大的应该尽量往右

Code:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 50010;
string mmax[N],mmin[N];
string mmax_[N],mmin_[N];
int main()
{
    int n;
    cin>>n;
    int cnt=1;
    while (n -- )
    {
        string s;
        cin>>s;

        sort(s.begin(),s.end(),greater<int>());
        mmax[cnt]=s;
        mmax_[cnt]=s;

        sort(s.begin(),s.end());
        mmin[cnt]=s;
        mmin_[cnt]=s;

        cnt++;
    }

    sort(mmax+1,mmax+cnt);
    sort(mmin+1,mmin+cnt);

    for(int i=1;i<cnt;i++)
    {
        string now=mmin_[i];
        int l=1,r=cnt-1;
        while(l<r)
        {
            int mid=l+r>>1;
            if(mmax[mid]>=now) r=mid;
            else
            l=mid+1;
        }

        cout<<l<<" ";

        now=mmax_[i];
        l=1,r=cnt-1;
        while(l<r)
        {
            int mid=l+r+1>>1;
            if(mmin[mid]<=now) l=mid;
            else
            r=mid-1;
        }

        cout<<l<<endl;
    }

    return 0;
}


作者:机械之忍
链接:https://www.acwing.com/activity/content/code/content/2258833/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值