[CF1270F]Awesome Substrings
题目
点这里看题目。
分析
设前缀和\(s_r=\sum_{i=1}^r [S_i='1']\)
考虑满足要求的子串\((l,r]\)的要求:
\]
单独计算并不好算,考虑一个分块的优化。设置阈值\(T\)。
对于\(1\le k\le T\)的\(k\),对要求进行变形:
\]
设\(f(i,k)=ks_i-i\),那么当\(k\)固定的时候,设\(c(x,k)\)为\(f(i,k)=x\)的数量,答案就是:
\]
后面的那个循环,由于有值的\(c(x,k)\)不会超过\(n\)个,因此这一部分可以\(O(nT)\)计算。
对于\(T< k\le n\)的\(k\),继续变形:
\]
由于\(k>T\),所以有\(s_r-s_l< \frac nT\)。也就是说,这种情况下子串内 1 的数量比较少。那么我们就可以直接枚举子串的起点(即式子中的\(l\))和子串内 1 的数量来计算。
当我们确定了 1 的数量的时候,我们也就可以确定此时右端点的范围\((x,y]\),那么也就知道了区间长度的范围\((x-i,y-i]\)。此时的询问就变成求区间内的\(k\)的倍数的数量,可以\(O(1)\)。
需要注意的是,由于这一部分不能前面的记重,因此应该满足:
k>T&\Rightarrow \frac{r-l}{s_r-s_l}>T\\
&\Rightarrow r-l>T(s_r-s_l)
\end{aligned}\]
即区间长度必须大于\(T(s_r-s_l)\),特判一下即可。
时间复杂度是\(O(nT+\frac{n^2}T)\),取\(T=\sqrt n\)最优。
代码
#include <cmath>
#include <cstdio>
#include <cstring>
typedef long long LL;
const int MAXN = 2e5 + 5, MAXT = 505;
template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
}
template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
}
template<typename _T>
_T MAX( const _T a, const _T b )
{
return a > b ? a : b;
}
int buc[MAXN * MAXT];
int s[MAXN], nxt[MAXN];
int N, T;
char S[MAXN];
int main()
{
LL ans = 0;
scanf( "%s", S + 1 ), N = strlen( S + 1 ), T = ceil( sqrt( N ) );
for( int i = 1 ; i <= N ; i ++ ) s[i] = s[i - 1] + S[i] - '0';
if( s[N] == 0 ) { puts( "0" ); return 0; }
for( int i = N ; ~ i ; i -- )
{
if( s[i] ^ s[i + 1] ) nxt[i] = i + 1;
else nxt[i] = nxt[i + 1];
}
for( int k = 1, t ; k <= T ; k ++ )
{
for( int i = 0 ; i <= N ; i ++ ) buc[s[i] * k - i + N] ++;
for( int i = 0 ; i <= N ; i ++ ) t = buc[s[i] * k - i + N], ans += 1ll * t * ( t - 1 ) / 2, buc[s[i] * k - i + N] = 0;
}
int l, r, tl, tr;
for( int i = 0 ; i < N ; i ++ )
{
l = i, r = nxt[i];
for( int k = 1 ; k <= N / T && s[i] + k <= s[N] ; k ++ )
{
l = nxt[l], r = nxt[r];
tr = r - i - 1, tl = l - i;
tl = MAX( tl, k * T + 1 );
if( tl <= tr ) ans += tr / k - ( tl - 1 ) / k;
}
}
write( ans ), putchar( '\n' );
return 0;
}
[CF1270F]Awesome Substrings的更多相关文章
- [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串
Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...
- Leetcode: Unique Substrings in Wraparound String
Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...
- CSU-1632 Repeated Substrings (后缀数组)
Description String analysis often arises in applications from biology and chemistry, such as the stu ...
- CF451D Count Good Substrings (DP)
Codeforces Round #258 (Div. 2) Count Good Substrings D. Count Good Substrings time limit per test 2 ...
- LA4671 K-neighbor substrings(FFT + 字符串Hash)
题目 Source http://acm.hust.edu.cn/vjudge/problem/19225 Description The Hamming distance between two s ...
- 后缀数组---New Distinct Substrings
Description Given a string, we need to find the total number of its distinct substrings. Input T- nu ...
- Codeforces Round #258 D Count Good Substrings --计数
题意:由a和b构成的字符串,如果压缩后变成回文串就是Good字符串.问一个字符串有几个长度为偶数和奇数的Good字串. 分析:可知,因为只有a,b两个字母,所以压缩后肯定为..ababab..这种形式 ...
- SPOJ 694. Distinct Substrings (后缀数组不相同的子串的个数)转
694. Distinct Substrings Problem code: DISUBSTR Given a string, we need to find the total number o ...
- Codeforces Round #306 (Div. 2) A. Two Substrings 水题
A. Two Substrings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/550/pro ...
随机推荐
- jquery.min.js v1.10.3版本autocomplete方法会在text前添加搜索出多少项的文本信息 要去除
http://stackoverflow.com/questions/13011127/how-to-remove-change-jquery-ui-autocomplete-helper-text ...
- 一个文件搞定Asp.net core 3.1动态页面转静态页面
最近一个Asp.net core项目需要静态化页面,百度查找了一下,没有发现合适的.原因如下 配置麻烦. 类库引用了第三方类,修改起来麻烦. 有只支持MVC,不支持PageModel. 继承Actio ...
- java,netcore和nodejs api性能测试
一. 前言 作为有点经验的码农,现在退休在家带孩子.闲来无事,想对使用过的框架(如果写语言容易引战,php是世界上最好的语言)做一个性能测试. 二. 背景 由于毕业后刚开始接触的编程语言是C#, 从a ...
- SQL——SQL约束
SQL约束 - 用于限制加入表的数据的类型 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). NOT NULL ...
- Python的元类简单介绍
* 类型 和类 在Python中,一切都是对象.类也是对象.所以一个类必须有一个类型 注意: 1.type Python3中所有的类都是通过type来创建出来的 2.object:Python3中所有 ...
- SQL SERVER修改为sa登陆权限报错,233,18456接连出现【抓狂ing】
[记录生活] 今天做作业需要修改sa权限,本人电脑没错误. 同样教程发给朋友,错误百出.... 话不多说,百度很多解决方法,但是都没有解决,贴出解决方法. 0.用Windows身份验证登录,执行SQL ...
- 工作中oracle常用操作
常用数据库操作 启动数据库监听器lsnrctl start 停止数据库监听器lsnrctl stop 登录oraclesqlplus / as sysdba启动oralcestartup;关闭orac ...
- 发光加载环动画-纯CSS动画效果-如何创建CSS3旋转预加载器(参照https://www.bilibili.com/video/BV1V4411C7z5?from=search&seid=9741275927942612817)
//css部分 body{ margin:; padding:; background: #262626; } .ring{ position: absolute; top:50%; left: 50 ...
- [SD心灵鸡汤]007.每月一则 - 2015.11
1.不要因为世界太过复杂,而背叛了你的单纯. 2.人的一生要疯狂一次,无论是为一个人,一段情,一段路途或一个梦想. 3.时间真的很神奇,你永远不知道它会如何改变你.换句话说:以前难吃的蔬菜.苦涩的啤酒 ...
- 【译】Gartner CWPP市场指南
https://www.gartner.com/doc/reprints?id=1-1YSHGBQ8&ct=200416&st=sb?utm_source=marketo&ut ...