题目大意

对于一个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的更多相关文章

  1. BZOJ2084: [Poi2010]Antisymmetry

    2084: [Poi2010]Antisymmetry Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 187  Solved: 125[Submit] ...

  2. 【BZOJ2084】[Poi2010]Antisymmetry(manarcher)

    [BZOJ2084][Poi2010]Antisymmetry(manarcher) 题面 BZOJ 洛谷 题解 一眼马拉车吧...明显就是在回文串的基础上随便改了改. 似乎还可以魔改回文树,然而我这 ...

  3. POI2010题解

    POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...

  4. 【bzoj2084】[Poi2010]Antisymmetry

    2084: [Poi2010]Antisymmetry Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1205  Solved: 756[Submit ...

  5. bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp)

    bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp) bzoj Luogu 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一 ...

  6. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  7. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  8. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  9. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

随机推荐

  1. java中关于异常的处理

    初学java的时候,当我们碰到异常时,一般会把异常直接throws抛出去,或则在catch的时候,简单的写一句打印异常信息,但是在实际开发中,是不能这么做的.如果我们将底层的某一个异常简单的print ...

  2. ajax请求超时解决方案

    设置timeout的时间,通过检测complete时status的值判断请求是否超时,如果超时执行响应的操作. var ajaxTimeoutTest=$.ajax({ url:'',//请求地址 t ...

  3. 请列举出JS对象的几种创建方式?

    javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用. 1.对象字面量的方式 var person={firstname:&q ...

  4. python中字典类型的使用

    Python字典类型 字典是一种键值对的集合,键值对之间无序 字典类型的定义 采用{}或者dict()来创建字典对象,键值对之间使用:进行分隔. {<键1>:<值1>, < ...

  5. MySQL--16 MHA修复

    目录 一.恢复MHA 二.MHA切换 三.配置VIP漂移 一.恢复MHA #1.修复旧主库 [root@db01 ~]# /etc/init.d/mysqld start #2.在mha日志中找到ch ...

  6. 【LeetCode】抽样 sampling(共4题)

    第一部分 水塘抽样 reservoir sampling 水塘抽样的原理:(应该开一篇新文章)pssss [382]Linked List Random Node (2018年11月15日,新算法) ...

  7. Vue:子组件如何跟父组件通信

    我们知道,父组件使用 prop 传递数据给子组件.但子组件怎么跟父组件通信呢?这个时候 Vue 的自定义事件系统就派得上用场了. 使用 v-on 绑定自定义事件 每个 Vue 实例都实现了事件接口,即 ...

  8. springboot中使用RabbitMq

    转载:http://www.ityouknow.com/springboot/2016/11/30/spring-boot-rabbitMQ.html RabbitMQ 即一个消息队列,主要是用来实现 ...

  9. office2016pro专业版命令行激活

    1.首先查看Office2016安装目录在哪里,如果是默认安装,没有修改路径,是在C:\Program Files\Microsoft Office\Office16目录下,具体路径还得自行查看,我的 ...

  10. 接口需要上一个接口的返回值(unittest)

    import unittest,requests ''' 使用unittest框架的时候,这个接口需要上一个接口的返回值 ''' class Test_case(unittest.TestCase): ...