首页 > 其他分享 >CF1383E Strange Operation

CF1383E Strange Operation

时间:2024-08-14 19:16:33浏览次数:9  
标签:const int Strange str 序列 Operation CF1383E MOD

小清新 Counting 题,想到转化成序列计数后就不难了

考虑将一个 0/1 串等价转化为一个刻画相邻两个 \(1\) 之间有几个 \(0\) 的序列

比如样例中的 \(00101100011100\) 就可以转化为 \(\{2,1,0,3,0,0,2\}\) 这个序列,显然转化后的序列和原来的 0/1 串等价

考虑此时一次操作相当于将序列中某个数减 \(1\);或者将某个不在末尾的 \(0\) 删去

因此可以用类似自动机的思路判定一个序列是否可以由原始的序列 \(\{a\}\) 生成

即令 \(f_i\) 表示匹配到原序列的第 \(i\) 个位置,对应的序列的总方案数,转移考虑枚举在序列末尾加上的数 \(x\),则可以转移到 \(i\) 之后的第一个位置 \(j\),满足 \(a_j\ge x\)

不妨换一个思路,考虑 \(f_i\) 对 \(f_j\) 的贡献,手玩一下会发现系数就是 \(a_j-\max_\limits{i<k<j} a_k\)

这种涉及到 \(\max\) 的问题很容易想到单调栈,我们从前往后维护一个递减的单调栈,每次弹栈的时候更新下贡献即可

代码是祁神写的,复杂度 \(O(n)\)

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int INF = (int)1e18+5;
const int MOD = (int)1e9+7;
const int N = (int)1e6+5;

void add(int &x, int a){if ((x+=a)>=MOD) x-=MOD;}

string str;
int dp[N], sum[N];
struct Node{
    int pos, bd;
};
Node stk[N]; int top=-1;

signed main(){
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> str;
    int len = str.length();
    vector<int> space;
    int cnt0=0;
    for (int i=0; i<len; ++i){
        if ('0'==str[i]) ++cnt0;
        else space.push_back(cnt0), cnt0=0;
    }

    // printf("space:"); for (int i=0; i<space.size(); ++i) printf("%lld ", space[i]); printf("cnt0=%lld\n", cnt0);

    if (0==space.size()){
        cout << cnt0 << '\n';
        return 0;
    }else if (1==space.size()){
        cout << (cnt0+1)*(space[0]+1)%MOD << '\n';
        return 0;
    }
    int bis = (cnt0+1)*(space[0]+1)%MOD;
    int sz = space.size();
    space[0] = INF;
    stk[++top] = Node{0, -1};
    dp[0] = 1;
    for (int i=1; i<sz; ++i){
        while (top>=0 && space[stk[top].pos] <= space[i]){
            auto [pos, bd] = stk[top--];
            add(dp[i], dp[pos]*(space[i]-bd)%MOD);
            add(dp[i], (MOD+sum[pos-1]-sum[stk[top].pos])%MOD*(space[i]-space[pos])%MOD); 
        }
        add(dp[i], dp[stk[top].pos]*(space[i]-stk[top].bd)%MOD);
        sum[i] = (sum[i-1]+dp[i])%MOD;
        stk[top].bd = space[i];
        stk[++top] = Node{i, -1};
    }

    // printf("dp:"); for (int i=0; i<sz; ++i) printf("%lld ", dp[i]); puts("");
    

    int ans=0;
    for (int i=0; i<sz; ++i) add(ans, dp[i]);
    ans = ans*bis%MOD;
    cout << ans << '\n';
    return 0;
}

标签:const,int,Strange,str,序列,Operation,CF1383E,MOD
From: https://www.cnblogs.com/cjjsb/p/18359623

相关文章

  • OFtutorial04_basicFieldOperations解析
    OFtutorial4.C源码#include"fvCFD.H"//Thisisafunctiondeclaration;thismethodwillcalculatesomescalarvalue//giventhecurrenttime,locationinspacex,andareferencepointx0.The//functionalsoacceptsascalingfactor,scale.......
  • CF1654E Arithmetic Operations 题解
    CF1654E给定一个长度为\(n\)的序列\(a\)。问至少需要修改几个数才能使得\(a\)变为一个等差数列。\(n\leq10^5\),\(1\leqa_i\leq10^5\)。我们可以发现值域\(\leq10^5\)实属可疑,我们可以就这点进行分析考虑对于序列的公差\(d\),如果\(d\)太大的话经过若干......
  • SQL Zoo 7.More JOIN operations
    以下数据均来自SQLZoo1.Listthefilmswherethe yr is1962[Show id, title](列出1962年的电影)SELECTid,titleFROMmovieWHEREyr=19622.Giveyearof'CitizenKane'.(给出《公民凯恩》的年份)selectyrfrommoviewheretitle='CitizenKane'3.List......
  • leetcode 1486. 数组异或操作 https://leetcode.cn/problems/xor-operation-in-an-arr
    1486.数组异或操作题目描述给你两个整数,n和start。数组nums定义为:nums[i]=start+2*i(下标从0开始)且n==nums.length。请返回nums中所有元素按位异或(XOR)后得到的结果。示例示例1:输入:n=5,start=0输出:8解释:数组nums为[0,2,4,6,8],其中(0^......
  • VMware Aria Operations 8.18 发布 (新增功能概览) - 多云 IT 运维管理
    VMwareAriaOperations8.18发布(新增功能概览)-多云IT运维管理通过统一的高性能平台,实现跨私有云、混合云和多云环境的IT运维管理。请访问原文链接:https://sysin.org/blog/vmware-aria-operations/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwareAri......
  • Machine Learning Operations
    MachineLearningOperationshttps://ml-ops.org/WithMachineLearningModelOperationalizationManagement(MLOps),wewanttoprovideanend-to-endmachinelearningdevelopmentprocesstodesign,buildandmanagereproducible,testable,andevolvableML-......
  • 【iOS】——NSOperation和NSOperationQueue学习总结
    NSOperation、NSOperationQueue简介NSOperation、NSOperationQueue是基于GCD更高一层的封装,完全面向对象。但是比GCD更简单易用、代码可读性也更高。NSOperation、NSOperationQueue的优点可添加完成的代码块,在操作完成后执行。添加操作之间的依赖关系,方便的控制......
  • Caused by: io.lettuce.core.RedisCommandExecutionException: WRONGTYPE Operation a
    当遇到io.lettuce.core.RedisCommandExecutionException:WRONGTYPEOperationagainstakeyholdingthewrongkindofvalue这个异常时,说明你在Redis中尝试执行的操作与存储在特定键中的数据类型不匹配。下面是一些具体的步骤来帮助你解决问题:1.确定键的数据类型首先,你......
  • 题解:CF718A Efim and Strange Grade
    CF718AEfimandStrangeGrade题解算法贪心+模拟思路分析显然,要最优每一次进位就只能五入不能四舍。而且当我们五入时,要取位数最高的。比如说\(1.3535\),我们有两种进位方式,一种是进位成\(1.4\),一种是进位成\(1.354\),显然前者更优。那这道题给的次数有啥用呢?考虑一种“......
  • 题解:CF718A Efim and Strange Grade
    CF718AEfimandStrangeGrade题解算法贪心+模拟思路分析显然,要最优每一次进位就只能五入不能四舍。而且当我们五入时,要取位数最高的。比如说\(1.3535\),我们有两种进位方式,一种是进位成\(1.4\),一种是进位成\(1.354\),显然前者更优。那这道题给的次数有啥用呢?考虑一种“......