【题解】Antisymmetry
题目大意
对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串。比如00001111和010101就是反对称的,1001就不是。
现在给出一个长度为N的01字符串,求它有多少个子串是反对称的。
输入样例
第一行一个正整数N (N ≤ 500,000)。第二行一个长度为N的01字符串。
输出样例
一个正整数,表示反对称子串的个数。
输入样例
8
11001011
输出样例
7
题解
最简单的方法就是二分+Hash了。
我们可以想,对于每个点$i$,如果字符串$[i - j + 1...i + j]$为反对称的,则对于满足$1 \leqslant k < j$的$k$,都有字符串$[i - k + 1...i + k]$为反对称的。
根据这个单调性,我们只需要枚举$i$,然后二分$j$即可。
#include <iostream>
#include <cstdio> #define MAX_N (500000 + 5) using namespace std; typedef unsigned long long ull;
typedef const unsigned long long cull;
int n;
char s[MAX_N];
cull b = ;
ull h1[MAX_N], h2[MAX_N], pb[MAX_N];
int ans; int main()
{
scanf("%d%s", &n, s + );
pb[] = ;
for(register int i = , j = n; i <= n; ++i, --j)
{
h1[i] = h1[i - ] * b + (s[i] == '') + ;
h2[j] = h2[j + ] * b + (s[j] == '') + ;
pb[i] = pb[i - ] * b;
}
int lt, rt, mid;
for(register int i = ; i <= n; ++i)
{
lt = ;
rt = min(i, n - i);
while(lt <= rt)
{
mid = lt + rt >> ;
if(h1[i + mid] - h1[i - mid] * pb[mid << ] != h2[i - mid + ] - h2[i + mid + ] * pb[mid << ]) rt = mid - ;
else lt = mid + ;
}
ans += rt;
}
printf("%d", ans);
return ;
}
参考程序(Hash)
当然,我们也可以直接用manacher做。
其实反对称就类似回文,这里的反对称其实可以理解为对于每个字符串,左半边异或后等于右半边,我们把manacher稍微改一下即可。
注意,这里不能随枚举奇数长度的子串,因为奇数长度本身就是不可能反对称的,这样子可能会影响偶数长度子串的判断。
#include <iostream>
#include <cstdio> #define MAX_N (500000 + 5) using namespace std; int n;
char s[MAX_N];
int len;
char ns[MAX_N << ];
int p[MAX_N << ];
char to[];
long long ans; int main()
{
scanf("%d%s", &n, s + );
len = n << | ;
ns[] = '~';
ns[len + ] = '^';
ns[] = '#';
for(register int i = ; i <= n; ++i)
{
ns[i << ] = s[i];
ns[i << | ] = '#';
}
to[''] = '';
to[''] = '';
to['#'] = '#';
to['~'] = '~';
to['^'] = '^';
int rt = , mid = ;
for(register int i = ; i <= len; i += )
{
if(i < rt) p[i] = min(rt - i + , p[(mid << ) - i]);
else p[i] = ;
while(ns[i + p[i]] == to[ns[i - p[i]]]) ++p[i];
if(i + p[i] - > rt)
{
rt = i + p[i] - ;
mid = i;
}
ans += p[i] >> ;
}
printf("%lld", ans);
return ;
}
参考程序(Manacher)
【题解】Antisymmetry的更多相关文章
- BZOJ2084: [Poi2010]Antisymmetry
2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 187 Solved: 125[Submit] ...
- 【BZOJ2084】[Poi2010]Antisymmetry(manarcher)
[BZOJ2084][Poi2010]Antisymmetry(manarcher) 题面 BZOJ 洛谷 题解 一眼马拉车吧...明显就是在回文串的基础上随便改了改. 似乎还可以魔改回文树,然而我这 ...
- POI2010题解
POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...
- 【bzoj2084】[Poi2010]Antisymmetry
2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1205 Solved: 756[Submit ...
- bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp)
bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp) bzoj Luogu 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
随机推荐
- form表单,登录用户,密码,按钮,提交、重置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C#Contains方法的错误理解
一,我们先看看代码: string aa = "1,2,3,44"; "; "); "); Console.WriteLine("a输出&q ...
- markdown语法规则
标题 标题是每篇文章最常用的格式,在markdown中如果要定义标题的话,只要在这段文字之前加#号就可以了. # 一级标题 ## 二级标题 ### 三级标题 以此类推,总共六级标题,建议在#号之后加上 ...
- C语言字符串复制
strcpy(arg1,arg2);//将arg2内容赋值到arg1 strncpy(arg1,arg2,size);//赋值多少由size决定,如果要截取某一部分,可以将arg2指针进行arg2+x ...
- Java虚拟机(JVM)与垃圾回收机制(GC)的详解
一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时 ...
- 同步mysql
ElasticSearch同步MySql 标签: elasticsearchmysql 2016-07-01 09:07 4636人阅读 评论(8) 收藏 举报 分类: Elasticsearch( ...
- Python3.5-20190503-廖老师-自我笔记
列表和元组 list1 = [1,4,6,788,345,757] tuple1 = (345,234,567,878) 切记你的变量名不能和 hel ...
- 微软Cortana可以帮助任何人解锁您的Windows 10系统
Cortana是微软在每个版本的Windows10中都内置的基于人工智能的智能助手,可以帮助攻击者解锁你的系统密码. 在周二发布的最新补丁中,微软推出了一项重要更新,以解决Cortana中容易被利用的 ...
- 什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机)
本节知识点是<编译原理>第三章-词法分析,学习参考教材为清华大学出版社<编译原理>第三版: 前情提要: 字母表∑1和∑2的乘积( product): ∑1∑2 ={ab|a ∈ ...
- 【Linux】服务器间免密登录、免确认机器指纹
1.生成密钥 ssh-keygen -t rsa -C "<填写自己方便识别的注释>" -b 4096 没什么问题就执行三次空格. 三次问题是1.填入生成密钥对的路径 ...