GDUT 2020 ACM 月赛2 E

博客围绕给定长度为n的01串,定义f(l,r)为特定子串个数,求解∑i=1∑j=if(i,j)。先探讨f(1,n)的求法,得出递推关系,再推广到一般情况,通过一系列递推公式,可在O(n)时间递推得到pre、ppre、g,最终得出结果。

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

题意

给定一个长度为nnn010101sss(下标从1开始),定义f(l,r)f(l,r)f(l,r)为串slsl+1…sr−1srs_ls_{l+1}\dots s_{r-1}s_rslsl+1sr1sr的子串中,满足1的个数为奇数的串的个数。求∑i=1n∑j=inf(i,j)\sum\limits_{i=1}^n\sum\limits_{j=i}^nf(i,j)i=1nj=inf(i,j)

思路

先考虑f(1,n)f(1,n)f(1,n)如何求。令ti=s1 xor s2…sit_i=s_1\ xor\ s_2\dots s_iti=s1 xor s2si。(sis_isi是指字符sis_isi对应数字,tit_iti同样,以下亦是如此)特别地令t0=0t_0=0t0=0。则f(1,n)f(1,n)f(1,n)变为找满足ti≠tj(0≤i<j≤n)t_i\neq t_j(0 \leq i < j \leq n)ti=tj(0i<jn)的二元组(i,j)(i,j)(i,j)个数,ti≠tjt_i\neq t_jti=tj等价与ti=tj xor 1t_i=t_j\ xor\ 1ti=tj xor 1
易得递推关系
f(1,n+1)=f(1,n)+∑j=0n[tj=tn+1 xor 1]f(1,n+1)=f(1,n)+\sum\limits_{j=0}^n[t_j=t_{n+1}\ xor\ 1]f(1,n+1)=f(1,n)+j=0n[tj=tn+1 xor 1];
pre(n,num)=∑i=0n[ti=num]pre(n,num)=\sum\limits_{i=0}^n[t_i=num]pre(n,num)=i=0n[ti=num],特别地pre(−1,0)=pre(−1,1)=0pre(-1,0)=pre(-1,1)=0pre(1,0)=pre(1,1)=0;
f(1,n+1)=f(1,n)+pre(n,tn+1 xor 1)f(1,n+1)=f(1,n)+pre(n,t_{n+1}\ xor\ 1)f(1,n+1)=f(1,n)+pre(n,tn+1 xor 1);
推广到一般情况
f(l,r+1)=f(l,r)+∑i=l−1r[ti=tr+1 xor 1]=f(l,r)+pre(r,tr+1 xor 1)−pre(l−2,tr+1 xor 1)\begin{aligned} f(l,r+1)&=f(l,r)+\sum\limits_{i=l-1}^r[t_i=t_{r+1}\ xor\ 1] \\ &= f(l,r)+pre(r,t_{r+1}\ xor\ 1)-pre(l-2,t_{r+1}\ xor\ 1) \end{aligned}f(l,r+1)=f(l,r)+i=l1r[ti=tr+1 xor 1]=f(l,r)+pre(r,tr+1 xor 1)pre(l2,tr+1 xor 1)

gn=∑i=1nf(i,n)g_n=\sum\limits_{i=1}^nf(i,n)gn=i=1nf(i,n)
根据f(l,r)f(l,r)f(l,r)递推关系可得
gn+1=∑i=1n+1f(i,n+1)=∑i=1n(f(i,n)+pre(n,tn+1 xor 1)−pre(i−2,tn+1 xor 1))+tr+1=gn+n∗pre(n,tn+1 xor 1)−∑i=−1n−2pre(i,tn+1 xor 1)+tr+1\begin{aligned} g_{n+1}&=\sum\limits_{i=1}^{n+1}f(i,n+1) \\ &=\sum\limits_{i=1}^{n}(f(i,n)+pre(n,t_{n+1}\ xor\ 1)-pre(i-2,t_{n+1}\ xor\ 1))+t_{r+1}\\ &=g_{n}+n*pre(n,t_{n+1}\ xor\ 1)-\sum\limits_{i=-1}^{n-2}pre(i,t_{n+1}\ xor\ 1)+t_{r+1} \end{aligned}gn+1=i=1n+1f(i,n+1)=i=1n(f(i,n)+pre(n,tn+1 xor 1)pre(i2,tn+1 xor 1))+tr+1=gn+npre(n,tn+1 xor 1)i=1n2pre(i,tn+1 xor 1)+tr+1
由于pre(−1,0)=pre(−1,1)=0pre(-1,0)=pre(-1,1)=0pre(1,0)=pre(1,1)=0,所以
gn+1=gn+n∗pre(n,tn+1 xor 1)−∑i=0n−2pre(i,tn+1 xor 1)+tn+1g_{n+1}=g_{n}+n*pre(n,t_{n+1}\ xor\ 1)-\sum\limits_{i=0}^{n-2}pre(i,t_{n+1}\ xor\ 1)+t_{n+1}gn+1=gn+npre(n,tn+1 xor 1)i=0n2pre(i,tn+1 xor 1)+tn+1
ppre(n,num)=∑i=0npre(i,num)ppre(n,num)=\sum\limits_{i=0}^{n}pre(i,num)ppre(n,num)=i=0npre(i,num)
gn+1=gn+n∗pre(n,tn+1 xor 1)−ppre(n−2,tn+1 xor 1)+tn+1g_{n+1}=g_n+n*pre(n,t_{n+1}\ xor\ 1)-ppre(n-2,t_{n+1}\ xor\ 1)+t_{n+1}gn+1=gn+npre(n,tn+1 xor 1)ppre(n2,tn+1 xor 1)+tn+1;

pre(n+1,num)=pre(n,num)+[tn+1=num]pre(n+1,num)=pre(n,num)+[t_{n+1}=num]pre(n+1,num)=pre(n,num)+[tn+1=num];
ppre(n+1,num)=ppre(n,num)+pre(n+1,num)ppre(n+1,num)=ppre(n,num)+pre(n+1,num)ppre(n+1,num)=ppre(n,num)+pre(n+1,num);
可以O(n)O(n)O(n)递推得到pre,ppre,gpre,ppre,gpre,ppre,g
最后ans=∑i=1ngians=\sum\limits_{i=1}^ng_ians=i=1ngi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值