2084: [Poi2010]Antisymmetry

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 1205  Solved: 756
[Submit][Status][Discuss]

Description

对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串。比如00001111和010101就是反对称的,1001就不是。
现在给出一个长度为N的01字符串,求它有多少个子串是反对称的。

Input

第一行一个正整数N (N <= 500,000)。第二行一个长度为N的01字符串。

Output

一个正整数,表示反对称子串的个数。

Sample Input

8
11001011

Sample Output

7

hint
7个反对称子串分别是:01(出现两次), 10(出现两次), 0101, 1100和001011

HINT

Source

鸣谢 JZP

题意:

求一个01串中“反回文”子串的个数。“反回文”的定义为$str(i)=!str(N-i+1)$。

题解:

这道题枚举回文子串中间位置+二分答案即可AC,但实际上存在一种名为$Manacher$的线性算法。

我记得我个人解决回文子串问题的复杂度从$O(N^3)$到$O(N^2)$再到$O(NlogN)$不断进步,这次终于达到理论上的下限了……

(以下图片全部转自CSDN某dalao,侵删)

一般的回文串算法都是枚举回文串的中心位置然后分奇偶讨论。但$Manacher$算法提供了一种巧妙的方法使得可以将奇偶回文串在一起处理。

具体方法是在原串每两个字符间插入一个分隔符,再在头尾分别插入一个分隔符,分隔符要求不在原串中出现。如下:

然后我们考虑设$len(i)$表示在新串中以$i$为中心的回文串向右延伸的长度。如下:

接着归纳求解,假设我们已经求出了$len(1)—len(i-1)$的值,现在要求$len(i)$,记其中向右延伸到的位置最远的$len(Po)$为$P$(与扩展kmp神似),有如下几种情况:

若$i<=P$,那么找到$i$相对于$po$的对称位置$j$,如果$len[j]<=P-i$,如图:

此时由对称性可得$len[i]=len[j]$。

如果$len[j]>P-i$,如图:

此时$len[i]$至少为$P-$i,由于$i$右边的字符没有被匹配过,我们需要依次匹配并更新$Po$与$P$。

若$i>P$,如图:

此时之前处理的信息对$i$没有什么用,我们仍然需要依次匹配并更新。

$Manacher$算法每次新匹配$k$个位置,匹配完即退出。每个位置会被计算且仅被计算一次,所以该算法的复杂度是线性的。

这道题即是$Manacher$算法的模板,只需要把匹配运算修改一下即可。

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;
#define MAXN 500005
#define MAXM 500005
#define INF 0x7fffffff
#define ll long longchar tp[MAXN],str[MAXN<<1|1];
ll len[MAXN<<1|1];
inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=x*10+c-'0';return x*f;
}inline void solve(ll N){for(ll i=1;i<=N;i++)str[(i<<1)-1]='#',str[i<<1]=tp[i];str[N<<1|1]='#';str[0]='!';str[(N<<1|1)+1]='?';return;
}
inline bool check(char x,char y){return (x=='#'&&y=='#')||(((x-'0')^(y-'0'))==1);}
inline ll Manacher(ll N){ll pos=0,lag=0,ans=0;for(ll i=1;i<=N;i++){len[i]=(i<lag)?min(lag-i+1,len[(pos<<1)-i]):0;while(check(str[i+len[i]],str[i-len[i]])) len[i]++;if(i+len[i]-1>lag) lag=i+len[i]-1,pos=i;ans+=len[i]>>1;//cout<<len[i]<<endl;}return ans;
}int main(){ll N=read();cin>>tp+1;solve(N);printf("%lld\n",Manacher(N<<1|1));return 0;
}

转载于:https://www.cnblogs.com/YSFAC/p/9818363.html

【bzoj2084】[Poi2010]Antisymmetry相关推荐

  1. 【BZOJ2084】【洛谷P3501】[POI2010]ANT-Antisymmetry(Manache算法)

    题意描述 原题: 一句话描述:对于一个0/1序列,求出其中异或意义下回文的子串数量. 题解 我们可以看出,这个其实是一个对于异或意义下的回文子串数量的统计,什么是异或意义下呢?平常,我们对回文的定义是 ...

  2. 【bzoj2081】[Poi2010]Beads Hash

    题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...

  3. 【bzoj2085】[Poi2010]Hamsters hash+倍增

    dis[i][j][k]表示从第i个串的结尾到第j个串的结尾走过2^k个串的最小长度 dis[i][j][0]=len[j]-cal(i,j) cal(i,j)表示如果i的最长后缀等于j的最长前缀 倍 ...

  4. BZOJ 2084 [Poi2010]Antisymmetry(manacher)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2084 [题目大意] 对于一个01字符串,如果将这个字符串0和1取反后, 再将整个串反过 ...

  5. 【CentOS】利用Kubeadm部署Kubernetes (K8s)

    [CentOS]利用Kubeadm部署Kubernetes (K8s)[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体实验流程 1 系统准 ...

  6. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  7. 【C#】类——里式转换

    类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据 ...

  8. 【C#】Out与ref是干什么的?

    关于return: 1.最后没有写 return 语句的话,表示程序正常退出 2.不需要返回值时,存在return的作用 例子 void main() {return; //return退出该程序的作 ...

  9. 【软件工程】RUP与软件开发5大模型

    软件开发的5大模型 1.瀑布模型:按照人的思维一步一步的开发下去,如果需求分析得当,每个阶段顺利,结果还不错! 2.快速原型模型:后来人们发现,自己不可能一下子就把所有的需求搞清楚,总是在开发的过程中 ...

最新文章

  1. Oh My Zsh终端工具
  2. 借助Ant工具,实现快速开发
  3. 爬虫总结(五)-- 其他技巧
  4. Python学习之路:函数参数及调用
  5. 计算机休眠怎么唤醒,电脑休眠后,就无法唤醒了?怎么办?快速教你解决这个问题...
  6. 第二节:简易安装 和 快速入门Vue.js
  7. jquery梳理之常用选择器
  8. Git@OSC 已经支持 Gitlab Control 移动客户端
  9. 如何在Java中执行Python模块?从认识JEP库开始
  10. php redis 菜鸟,安装redis和phpredis模块
  11. gulp-livereload组件使用
  12. 一个链接泄露这么多隐私,你还敢拼多多助力吗?
  13. 男人心疼女人的13种方式
  14. 基于国产银河飞腾多核 DSP +FPGA的图像识别硬件设计与算法实现
  15. mca版Quiver快速入门
  16. android 验证邮箱格式,android开发中, 如何验证邮箱的格式 ?
  17. CSS3 3D变换--扑克牌翻转
  18. 简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试
  19. 【ClickHouse】<Error> Application: Caught exception while loading metadata: Code: 231. DB::Exception
  20. 论文阅读笔记:Recent Advances and Challenges in Task-oriented Dialog Systems

热门文章

  1. 3行代码Python搞定图片清晰度识别,原来我们看到不一定是这样的
  2. 计算机视觉论文-2021-09-10
  3. 9篇!悉尼科技大学入选CVPR2021都研究什么?
  4. MIT最新课程:一文看尽深度学习各领域最新突破(附视频、PPT)
  5. 基于Bounding Box的激光点云聚类
  6. C++ vector类型要点总结(以及各种algorithm算法函数)
  7. p20怎么用android auto,奔驰23P/P20驾驶辅助系统到底有哪些功能,怎么使用?
  8. fifo的valid信号啥时候为高_五角枫啥时候适合移栽?五角枫移栽最佳时间
  9. 计算机在机械制造领域中的应用论文,高科技在机械制造工艺中的应用论文
  10. 软考网络管理员学习笔记3之第三章网络体系结构