当前位置: 首页 > news >正文

CF962 E. Decode

原题链接:Problem - E - Codeforces

题意:多组测试,分别给出一串字符串,对于每一个范围[l,r]求出贡献并相加,贡献就是这个范围里面的小范围[x,y]有多少个,要求从x到y的字符串里面的0和1的数量相同。最后输出贡献。

思路:最直接的思路就是去枚举这个字符串的全部字串,再在这些子串里面枚举全部的字串,如果字串的字串0和1的数量相同,那么字串的贡献就增加一,但是这样肯定会超时。

透过现象看本质,可以发现对于每一个满足条件的[x,y],[x,y]包含在[x,y],[x+1,y],[x+1,y+1]....这些区间里面,并且每一个区间都会为答案提供一个贡献,所以这个区间能够给答案提供的贡献是x*(字符串长度-y+1),那么答案就被转换为了全部符合条件的[x,y]的数量*x*(字符串长度-y+1)。

那么可以先使用前缀和来求出全部的符合条件的区间,当字符为1的时候增加1,当字符为0的时候减少1,那么如果二个位置的前缀和相同那么他们的0和1的数量就一定是相同的。但是直接的找到符合条件的区间的时间复杂度是不行的,所以可以先使用map<int,vector<int>> 来记录前缀和相等的位置,并且这样存下来的字符串是一个大串的,例如:010101,前缀和是-1,0,-1,0,-1,0,map[-1]里面存的值就是1,3,5,意思就是2到3,4到5是符合条件的字符串,而且可以发现2到5也是符合条件的,这样一来可以更快的算出这类串的贡献(定义是一类串那么它们的前缀和的值就是相同的)。可以开一个再开一个前缀和来记录以当前位置为x那么左边可以取l的位置有多少个,这样就可以线性的求出一类串的全部贡献。为什么需要开前缀和来记录呢?可以从上面的例子中发现5这个位置的x可以是4,也可以是2,那么这个位置为y的贡献就是2*4+2*2=2*(4+2),这个4+2就是以5为y之后l可以取的位置数,2是r可以取的位置数。因为前缀和的性质,所以记录的点其实是符合条件的串的x-1位置,所以计算前缀和的时候需要+1。

//冷静,冷静,冷静
//调不出来就重构
#pragma GCC optimize(2)
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=1000000007;
ll pre[N];
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);ll t;cin>>t;while(t--){string s;cin>>s;s=' '+s;map<ll,vector<ll>> op;op[0].push_back(0);//因为只要前缀和数组出现0,那么就可以和第一个位置构成一个[x,y] for(int i=1;i<s.size();i++){pre[i]=pre[i-1]+(s[i]=='1')-(s[i]=='0');op[pre[i]].push_back(i);//记录前缀和相同的位置 }ll ans=0;for(auto it:op){vector<ll> p;vector<ll> add(it.second.size()+10);p.push_back(0);//增加0,为了后面的前缀和方便 for(auto v:it.second){p.push_back(v);}for(int i=1;i<p.size();i++){add[i]=add[i-1]+p[i]+1;//含义是当前位置左边可以取多少个l }for(int i=1;i<p.size();i++){ans=ans+(s.size()-p[i])*add[i-1]%mod;// s.size()-p[i]代表以当前位置为y,那么r可以取多少个,i是右端点,所以因该使用add[i-1]代表l可以取多少个 ans%=mod;}}cout<<ans<<endl;}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(四)
  • Python爬虫技术 第27节 API和RESTful服务
  • DITA的优点和缺点
  • 不可错过的2024翻译工具合集,提升沟通效率必备
  • windbg dmp文件
  • 网络安全之扫描探测阶段攻防手段(二)
  • 基于WEB的仓库管理系统的设计与实现
  • 阿里云上快速部署Dify社区版
  • Matlab|考虑大规模电动汽车接入电网的双层优化调度策略
  • transform详解
  • vite解决前端跨域步骤
  • 8.1-java+tomcat环境的配置+代理
  • 手机在网状态接口如何对接?(一)
  • 猫头虎分享AI写真系统架构分析
  • [FBCTF2019]RCEService (PCRE回溯绕过和%a0换行绕过)
  • 【Leetcode】104. 二叉树的最大深度
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android 控件背景颜色处理
  • canvas 五子棋游戏
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • react 代码优化(一) ——事件处理
  • vue:响应原理
  • Vue官网教程学习过程中值得记录的一些事情
  • 力扣(LeetCode)357
  • 码农张的Bug人生 - 初来乍到
  • 双管齐下,VMware的容器新战略
  • 微信小程序--------语音识别(前端自己也能玩)
  • 我这样减少了26.5M Java内存!
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 异步
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • !$boo在php中什么意思,php前戏
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #if #elif #endif
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (1)虚拟机的安装与使用,linux系统安装
  • (Java数据结构)ArrayList
  • (js)循环条件满足时终止循环
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (转)LINQ之路
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .Family_物联网
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET开发人员必知的八个网站
  • .net流程开发平台的一些难点(1)
  • .NET上SQLite的连接
  • /usr/bin/env: node: No such file or directory
  • @angular/cli项目构建--http(2)
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [《百万宝贝》观后]To be or not to be?
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [BZOJ3757] 苹果树
  • [C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法
  • [Datawhale AI夏令营 2024 第四期] 从零入门大模型微调之旅的总结