尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

QOJ#12181. abc

QOJ#12181. abc
📅 发布时间:2026/6/20 8:57:36
题意:给定包含 `a,b,c` 的字符串,长度 $n \leq 2 \times 10^5$,求所有区间权值和,区间权值为出现次数最多字母的个数减去出现次数最少字母的个数(出现次数不为0)。思路:先统一式子,包含3种字母区间 $val_{l,r} = \frac{|c_a - c_b| + |c_b - c_c| + |c_c - c_a|}2$ ,包含2种字母区间 $val_{l,r} = |c_a - c_b|$ ,1种字母区间无贡献。为简化维护,贡献乘2去分母,枚举两个字母 $A,B$ ,对于含 $A,B$ 区间算 $2|c_A - c_B|$ ,含三种字母区间减多余贡献算 $-|c_A - c_B|$ 。枚举区间右端点 $r$ ,用 $cnt_x$ 存差值为 $x$ 的区间个数及偏移量 $tag$ 从 $r - 1$ 转移,时间复杂度为线性 。

QOJ#12181. abc

题意

给你一个包含 \(\texttt{a,b,c}\) 的字符串。求所有区间的权值和。一个区间的权值定义为区间内出现次数的字母的个数,减去出现次数最少的字母的个数。(出现次数不为 \(0\))

\(n \le 2 \times 10^5\)。

思路

原式很难分讨。所以要先统一一下式子。

  • 对于包含 \(3\) 种不同字母的区间 \([l,r]\):

\[val_{l,r} = \frac{|c_a-c_b| + |c_b-c_c| + |c_c-c_a|}2 \]

  • 对于包含 \(2\) 种不同字母的区间 \([l,r]\),假设它包含 \(a,b\)。

\[val_{l,r} = |c_a-c_b| \]

  • 对于包含 \(1\) 种不同字母的区间 \([l,r]\),没有贡献。

这里怎么线性维护,感觉还是有点困难的。

这样要维护什么就很显然了吧。首先贡献乘二以去掉分母。

一种比较简洁的维护方法是,枚举两个字母 \(A,B\)。

  • 对于包含 \(A,B\) 的区间,计算 \(2|c_A - c_B|\)。这恰好满足包含两种不同字母的区间的贡献。
  • 对于包含三种字母的区间,要减去多余的贡献。计算 \(-|c_A - c_B|\)。

我们枚举区间右端点 \(r\)。

维护以 \(r\) 为右端点的区间的贡献。怎么从 \(r-1\) 转移过来。

加入 \(a_r\) 后,绝对值为 \(0,\pm1\) 的贡献需要变化。我们用 \(cnt_x\) 存差值(非绝对值)为 \(x\) 的区间个数。

因为不能左右移 \(cnt\) 数组。所以再记一个偏移量 \(tag\) 即可。

加入 \(a_r\) 后有可能要加入新的区间。直接加即可。

时间复杂度线性。

code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace wing_heart {constexpr int N=2e5+7;int n;char s[N];int t[N];int cnt[N<<1],tag;ll ans;void solve(int a,int b) {memset(cnt,0,sizeof(cnt)); tag=0;int cl=0,cr=0;ll sl=0,sr=0;int sa=0,sb=0;int l=0;rep(r,1,n) {if(t[r]==a) cr+=cnt[-tag+N],sr+=cr,tag++,sl-=cl,cl-=cnt[-tag+N],sa++;if(t[r]==b) cl+=cnt[-tag+N],sl+=cl,tag--,sr-=cr,cr-=cnt[-tag+N],sb++;while(sa && sb) {++l;cnt[sa-sb-tag+N]++;if(sa-sb>0) cr++, sr+=sa-sb;if(sa-sb<0) cl++, sl+=sb-sa;if(t[l]==a) --sa;if(t[l]==b) --sb;}ans+=2*(sl+sr);}memset(cnt,0,sizeof(cnt)); tag=0;cl=0,cr=0;sl=0,sr=0;sa=0,sb=0;int sc=0,c=3^a^b;l=0;rep(r,1,n) {if(t[r]==a) cr+=cnt[-tag+N],sr+=cr,tag++,sl-=cl,cl-=cnt[-tag+N],sa++;if(t[r]==b) cl+=cnt[-tag+N],sl+=cl,tag--,sr-=cr,cr-=cnt[-tag+N],sb++;if(t[r]==c) sc++;while(sa && sb && sc) {++l;cnt[sa-sb-tag+N]++;if(sa-sb>0) cr++, sr+=sa-sb;if(sa-sb<0) cl++, sl+=sb-sa;if(t[l]==a) --sa;if(t[l]==b) --sb;if(t[l]==c) --sc;}ans-=sl+sr;}}void main() {sf("%d",&n);sf("%s",s+1);rep(i,1,n) t[i] = s[i]-'a';solve(0,1), solve(1,2), solve(2,0);pf("%lld\n",ans/2);}
}
int main() {#ifdef LOCALfreopen("in.txt","r",stdin);freopen("my.out","w",stdout);#endifwing_heart :: main();
}

本文来自博客园,作者:wing_heart,转载请注明原文链接:https://www.cnblogs.com/wingheart/p/19151871

相关新闻

  • 行业配置策略
  • Kubernetes 主流网络插件的关键差异对比 - 详解
  • dokuwiki制作侧边栏

最新新闻

  • ARM中断与VIC控制器实战:从原理到配置与避坑指南
  • LPC210x ARM7 ADC与定时器实战:从寄存器配置到驱动代码
  • 北京家里漏水总反复?北京靠谱漏水检测公司实用参考 - 速递信息
  • 本地部署大模型实战指南:Ollama+DeepSeek+Qwen2全链路踩坑与优化
  • 如何快速获取网盘真实下载地址:3步搞定九大平台
  • Trae:AI原生开发的操作系统与MCP技能调度范式

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号