codeforce 922D Robot Vacuum Cleaner

本文介绍了一种算法,用于解决由多个字符串组成的大字符串中,“sh”子串出现次数最大化的组合问题。通过定义一个特殊的数据结构并采用排序策略,确保了最优组合的生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

题目链接

 给定n个字符串,问你由这n个字符串组成的大的字符串中那种组合方式

使得“sh”子串出现的次数最多,输出次数。

问题分析:

 我们想要知道全部的子串的排序方式,我们就需要知道相邻的两个应该怎么放置

相邻的两个比较哪一个放置在前边要更优,这个问题和排序差不多,将大的数放在

前面,这里是将最适合的放在前面。


#include<bits/stdc++.h>
using namespace std;
#define N 1000005
#define LL long long
struct Node{
    int s=0,h=0,sh=0;
    string a;
    bool operator<(const Node x)const{
        LL A = 1ll*s*x.h+sh+x.sh;
        LL B = 1ll*x.s*h+sh+x.sh;
        return A>B;
    }
}E[N];
int Nums[N],Numh[N];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>E[i].a;
        int len = E[i].a.length();
        for(int j=0;j<len;j++){
           if(E[i].a[j]=='s')E[i].s++;
           else {E[i].h++;
            E[i].sh+=E[i].s;}
        }
    }
    sort(E,E+n);
    LL res=0;
    LL tmp=0;
    for(int i=0;i<n;i++){
        int len = E[i].a.length();
        for(int j=0;j<len;j++){
            if(E[i].a[j]=='s')tmp++;
           else res+=tmp;
        }
    }
    cout<<res;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值