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

[八省联考 2018] 制胡窜

【题意】
给你一个字符串 S S S,每次询问给你两个整数 l , r l, r l,r,让你查询有多少个整数对 ( i , j ) , 1 < = i < i + 1 < j < = n (i, j), 1 <= i < i + 1 < j <= n (i,j),1<=i<i+1<j<=n,满足 S 1 , i , S i + 1 , j − 1 , S j , n S_{1,i}, S_{i+1,j-1},S_{j,n} S1,i,Si+1,j1,Sj,n 包含 S l , r S_{l,r} Sl,r

【思路】
感觉直接讨论的细节有一点多,我想偷点懒所以用了容斥。

我们设 f i , j , k ( 0 < = i , j , k < = 1 ) f_{i,j,k}(0<=i,j,k<=1) fi,j,k(0<=i,j,k<=1) 表示三段里面是否必须包含 S l , r S_{l,r} Sl,r,其中1表示必须。

那么根据容斥, a n s = f 1 , 0 , 0 + f 0 , 1 , 0 + f 0 , 0 , 1 − f 1 , 1 , 0 − f 1 , 0 , 1 − f 0 , 1 , 1 + f 1 , 1 , 1 ans=f_{1,0,0}+f_{0,1,0}+f_{0,0,1}-f_{1,1,0}-f_{1,0,1}-f_{0,1,1}+f_{1,1,1} ans=f1,0,0+f0,1,0+f0,0,1f1,1,0f1,0,1f0,1,1+f1,1,1

只要算出每一项即可。

注意到,如果存在三个与 S l , r S_{l,r} Sl,r 相等的子串,并且两两相交部分不超过 1 ,那么一定是任意整数对都满足条件,我们把这种情况特判一下,剩下的情况就有 f 1 , 1 , 1 = 0 f_{1,1,1}=0 f1,1,1=0

我们建出 sam ,并且让 S l , r S_{l,r} Sl,r 对应的点为 p,考虑 p 的 endpos 集合,假设其大小为 m。

先说一下,长度为 n 的 S S S n − 1 n-1 n1 个空隙,题目等价于找不同的两个空隙把 S S S 切割开。

1.对于 f 1 , 0 , 0 f_{1,0,0} f1,0,0 ,只需要确保选择的空隙都在 e d 1 ed_1 ed1 右边即可。
f 1 , 0 , 0 = ∑ i = 1 x − 1 ∑ j = i + 1 x 1 = x ( x − 1 ) 2 ,其中 x = n − e d 1 f_{1,0,0}=\sum_{i=1}^{x-1}\sum_{j=i+1}^x1=\frac{x(x-1)}{2},其中x=n-ed_1 f1,0,0=i=1x1j=i+1x1=2x(x1),其中x=ned1

2.对于 f 0 , 0 , 1 f_{0,0,1} f0,0,1 ,只需要确保选择的空隙都在 e d m − L e n + 1 ( L e n = r − l + 1 ) ed_m-Len+1(Len=r-l+1) edmLen+1(Len=rl+1) 左边即可。
f 0 , 0 , 1 = x ( x − 1 ) 2 , 其中 x = e d m − L e n f_{0,0,1}=\frac{x(x-1)}{2},其中x=ed_m-Len f0,0,1=2x(x1),其中x=edmLen

3.对于 f 0 , 1 , 0 f_{0,1,0} f0,1,0 我们只需要枚举 endpos 中间哪一个作为第二段中最先出现的。
f 0 , 1 , 0 = ∑ i = 2 m ( e d i − e d i − 1 ) ( n − e d i ) + ( e d 1 − L e n ) ( n − e d 1 ) = e d n ∗ n − ∑ i = 1 m e d i 2 + ∑ i = 1 m − 1 e d i e d i + 1 − n ∗ L e n + l e n ∗ e d 1 f_{0,1,0}=\sum_{i=2}^m(ed_i-ed_{i-1})(n-ed_i)+(ed_1-Len)(n-ed_1) \\ =ed_n*n-\sum_{i=1}^med_i^2+\sum_{i=1}^{m-1} ed_ied_{i+1}-n*Len+len*ed_1 f0,1,0=i=2m(ediedi1)(nedi)+(ed1Len)(ned1)=ednni=1medi2+i=1m1ediedi+1nLen+lened1

4.对于 f 1 , 0 , 1 f_{1,0,1} f1,0,1,只要保证选择的空隙都在最左边的出现位置和最右边的出现位置之间即可。
f 1 , 0 , 1 = C x 2 , 其中 x = e d n − L e n − e d 1 + 1 f_{1,0,1}=C_x^2,其中x=ed_n-Len-ed_1+1 f1,0,1=Cx2,其中x=ednLened1+1

5.对于 f 1 , 1 , 0 f_{1,1,0} f1,1,0,也是考虑集合 ∣ e d ′ ∣ = m ′ |ed'|=m' ed=m 为不与最左边出现位置相交的出现位置的 endpos 集合,然后枚举 e d ′ ed' ed 中哪一个是第二段中最先出现的。
f 1 , 1 , 0 = ∑ i = 2 m ′ ( e d i ′ − e d i − 1 ′ ) ( n − e d i ′ ) + ( e d 1 ′ − L e n − T ) ( n − e d 1 ′ ) ,其中 T = e d 1 − 1 = n ∗ e d m ′ ′ − ∑ i = 1 m ′ e d i ′ 2 + ∑ i = 1 m ′ − 1 e d i − 1 ′ e d i ′ − n ∗ L e n − T ∗ n + e d 1 ′ ∗ L e n + T ∗ e d 1 ′ f_{1,1,0}=\sum_{i=2}^{m'}(ed'_i-ed'_{i-1})(n-ed'_i)+(ed'_1-Len-T)(n-ed'_1),其中T=ed_1-1\\ =n*ed'_{m'}-\sum_{i=1}^{m'} {ed'_i}^2+\sum_{i=1}^{m'-1}ed'_{i-1}ed'_{i}-n*Len-T*n+ed'_1*Len+T*ed'_1 f1,1,0=i=2m(ediedi1)(nedi)+(ed1LenT)(ned1),其中T=ed11=nedmi=1medi2+i=1m1edi1edinLenTn+ed1Len+Ted1

  1. 对于 f 0 , 1 , 1 f_{0,1,1} f0,1,1,考虑集合 ∣ e d ′ ′ ∣ = m ′ ′ |ed''|=m'' ed′′=m′′ 为不与最右边出现位置相交的出现位置的 endpos 集合,然后枚举 e d ′ ′ ed'' ed′′ 中哪一个是第二段中最后出现的。
    f 0 , 1 , 1 = ∑ i = 1 m ′ ′ − 1 ( e d i + 1 ′ ′ − e d i ′ ′ ) ( e d i ′ ′ − L e n ) + ( t − e d n ′ ′ ) ( e d n ′ ′ − L e n ) = ∑ i = 1 m ′ ′ e d i ′ ′ e d i + 1 ′ ′ − ∑ i = 1 m ′ ′ e d i ′ ′ 2 + e d 1 ′ ′ ∗ L e n + T ∗ e d n ′ ′ − T ∗ L e n f_{0,1,1}=\sum_{i=1}^{m''-1}(ed''_{i+1}-ed''_i)(ed''_i-Len)+(t-ed''_n)(ed''_n-Len)\\ =\sum_{i=1}^{m''}ed''_ied''_{i+1}-\sum_{i=1}^{m''}ed_i''^2+ed''_1*Len+T*ed''_n-T*Len f0,1,1=i=1m′′1(edi+1′′edi′′)(edi′′Len)+(tedn′′)(edn′′Len)=i=1m′′edi′′edi+1′′i=1m′′edi′′2+ed1′′Len+Tedn′′TLen

因此,sam 上面用线段树维护 endpos。

值得一题的是,我的代码在洛谷一遍就过了,但是在loj拿了 0 分,测试一下发现本地是对的,但是loj评测机的环境就是错的,我尝试交打印调试信息的代码,结果发现加了几个 cout 输出就正确了,非常奇怪。

后面把线段树上查询时合并 endpos 信息的那里全部写在了函数内,就取得了通过,我现在也没搞清楚。

code1(洛谷AC,lojWA)
code2(洛谷loj都能AC)


http://www.kler.cn/a/512199.html

相关文章:

  • 2025年1月17日(点亮一个 LED)
  • Mac下安装ADB环境的三种方式
  • mysql查看binlog日志
  • 【2024 年度总结】从小白慢慢成长
  • 使用 C++ 实现神经网络:从基础到高级优化
  • AUTOSAR从入门到精通-城市NOA(领航辅助驾驶)
  • 畅游Diffusion数字人(14):基于3D人体网格的语音驱动手势视频生成 ECCV 2024
  • 如何使用C++来实现OPENAI协议通过OLLAMA来与AI大模型通信
  • 搭建一个基于Spring Boot的外贸平台
  • browser-use 的简单使用
  • [Datawheel学习]用Llama-index创建Agent、数据库对话Agent和RAG接入Agent
  • Python采集modBus协议数据
  • Linux网络IOv1.1介绍-纯PDF版
  • MySQL 中单独获取已知日期的年月日
  • 直驱式风电储能制氢仿真模型matlab/simulink
  • Type-C充电与智能家居的结合
  • 【王树森搜索引擎技术】概要01:搜索引擎的基本概念
  • MySQL 事务及MVCC机制详解
  • TypeScript - 利用GPT辅助学习
  • SparkSQL数据模型综合实践
  • 电路研究9——GPRS用的AT命令手册
  • Javascript IndexedDB 数据库
  • Golang学习笔记_28——工厂方法模式(实例)
  • 【开源免费】基于SpringBoot+Vue.JS夕阳红公寓管理系统(JAVA毕业设计)
  • 告别手动编辑:如何用Python快速创建Ansible hosts文件?
  • MyBatis与Hibernate的全面对比