题意描述

Antisymmetry

求给定的字符串的子串集合中为“反对串”的个数。

反对串的定义为,将这个字符串 \(0\) 和 \(1\) 取反后,再将整个串反过来和原串一样,就称作“反对串”。

算法分析

一开始想法是字符串 Hash \(O(n^2)\),不出意外 T 到飞起。

发现“反对串”的定义类似回文串,于是想到 Manacher,发现可行。

让我们先来探究一下“反对串”的几个性质:

  1. 若串 \(S(l,r)\) 为反对串,那么串 \(S'(l+1,r-1)\) 也为反对串。
  2. 若串 \(S(l,r)\) 为反对串且 \(a_{l-1}\neq a_{r+1}\),那么串 \(S'(l-1,r+1)\) 为反对串。
  3. 反对串的长度比为偶数。

有了这几个简单的性质就可以直接套用 Manacher 模板了。

利用性质 \(2\) 类似地求出最大长度。

不过基于性质 \(3\),只需要求偶数长度的串即可。(在 Manacher 上的表现为只拓展 '#')

然后利用性质 \(1\),易得答案为 \(\sum_{i=1}^{n}\frac{p_i}{2}(i\ mod\ 2=1)\)。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define N 500010
using namespace std; long long n,len=2,p[N<<1];
char a[N],s[N<<1]; int main(){
scanf("%d",&n);
scanf("%s",a+1);
s[0]='$',s[1]='#';
for(int i=1;i<=n;i++)
s[len++]=a[i],s[len++]='#';
s[len]='\0';
long long id,mx=0,ans=0;
for(int i=1;i<len;i+=2){
if(i<mx)
p[i]=min(p[2*id-i],mx-i);
else
p[i]=1;
while((s[i-p[i]]=='#' && s[i+p[i]]=='#') || (s[i-p[i]]-'0'+s[i+p[i]]-'0')==1)
p[i]++;
if(mx<i+p[i])
id=i,mx=i+p[i];
}
for(int i=1;i<len;i+=2)
ans+=p[i]-1;
printf("%lld\n",ans/2);
return 0;
}

完结撒❀。

Antisymmetry的更多相关文章

  1. 【BZOJ】【2084】【POI2010】Antisymmetry

    Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...

  2. BZOJ2084: [Poi2010]Antisymmetry

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

  3. BZOJ 2084: [Poi2010]Antisymmetry [Manacher]

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

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

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

  5. [BZOJ2084][Poi2010]Antisymmetry 二分+hash

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

  6. 【bzoj2084】[Poi2010]Antisymmetry

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

  7. 「POI2010」反对称 Antisymmetry (manacher算法)

    # 2452. 「POI2010」反对称 Antisymmetry [题目描述] 对于一个 $0/1$ 字符串,如果将这个字符串 $0$ 和 $1$ 取反后,再将整个串反过来和原串一样,就称作「反对称 ...

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

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

  9. BZOJ 2084: [Poi2010]Antisymmetry

    Sol Manacher. \(O(n)\) Manacher很简单啊.改一改转移就可以了. 然后我WA了.一开始天真的认为id只会是奇数,然后就GG. 一组 Hack 数据 3 1 0 0 然后就跳 ...

随机推荐

  1. P1000 超级玛丽游戏

    P1000 超级玛丽游戏 https://www.luogu.com.cn/problem/P1000 这就很简单了代码: #include <iostream> #include < ...

  2. JavaScript函数报错SyntaxError: expected expression, got ';'

    故事背景:编写Javaweb项目,在火狐浏览器下运行时firebug报错SyntaxError: expected expression, got ';'或者SyntaxError: expected ...

  3. 票房和口碑称霸国庆档,用 Python 爬取猫眼评论区看看电影《我和我的家乡》到底有多牛

    今年的国庆档电影市场的表现还是比较强势的,两名主力<我和我的家乡>和<姜子牙>起到了很好的带头作用. <姜子牙>首日破 2 亿,一举刷新由<哪吒之魔童降世&g ...

  4. C++对话框创建及修改对话框属性

    转载:http://www.51testing.com/html/48/n-3151648.html 创建对话框 C++中对话框分为模式对话框和非模式对话框. 模式对话框的创建: MyDialog m ...

  5. 给Python IDLE添加行号显示

    转载:https://blog.csdn.net/howard2005/article/details/104112297 文章目录一.引出问题1.Spyder编辑Python程序能显示行号2.Pyt ...

  6. ATMEGA的SPI总线 - 第2部分

    参考: 1.https://www.yiboard.com/thread-783-1-1.html 2.https://mansfield-devine.com/speculatrix/2018/01 ...

  7. P1879 [USACO06NOV] Corn Fields G

    题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他 ...

  8. 【题解】「MCOI-02」Convex Hull 凸包

    题目戳我 \(\text{Solution:}\) \[\sum_{i=1}^n \sum_{j=1}^n \rho(i)\rho(j)\rho(\gcd(i,j)) \] \[=\sum_{d=1} ...

  9. DES加解密算法(C语言实现)

    DES加密和解密算法的实现(C语言) 主要是做个记录,害怕以后代码丢了,先放到这里了. DES再不进行介绍了,可以看上一篇的 DES 的python实现 转载请注明出处:https://www.cnb ...

  10. ls: 显示目下的内容及相关属性信息

    ls: 显示目下的内容及相关属性信息 [功能说明] ls 命令可以理解为英文单词 "list" 的缩写,其功能是列出目录的内容及其内容属性信息(list directory con ...