【bzoj2084】[Poi2010]Antisymmetry
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
11001011
Sample Output
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相关推荐
- 【BZOJ2084】【洛谷P3501】[POI2010]ANT-Antisymmetry(Manache算法)
题意描述 原题: 一句话描述:对于一个0/1序列,求出其中异或意义下回文的子串数量. 题解 我们可以看出,这个其实是一个对于异或意义下的回文子串数量的统计,什么是异或意义下呢?平常,我们对回文的定义是 ...
- 【bzoj2081】[Poi2010]Beads Hash
题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...
- 【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的最长前缀 倍 ...
- BZOJ 2084 [Poi2010]Antisymmetry(manacher)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2084 [题目大意] 对于一个01字符串,如果将这个字符串0和1取反后, 再将整个串反过 ...
- 【CentOS】利用Kubeadm部署Kubernetes (K8s)
[CentOS]利用Kubeadm部署Kubernetes (K8s)[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体实验流程 1 系统准 ...
- 【Spring】框架简介
[Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...
- 【C#】类——里式转换
类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据 ...
- 【C#】Out与ref是干什么的?
关于return: 1.最后没有写 return 语句的话,表示程序正常退出 2.不需要返回值时,存在return的作用 例子 void main() {return; //return退出该程序的作 ...
- 【软件工程】RUP与软件开发5大模型
软件开发的5大模型 1.瀑布模型:按照人的思维一步一步的开发下去,如果需求分析得当,每个阶段顺利,结果还不错! 2.快速原型模型:后来人们发现,自己不可能一下子就把所有的需求搞清楚,总是在开发的过程中 ...
最新文章
- Oh My Zsh终端工具
- 借助Ant工具,实现快速开发
- 爬虫总结(五)-- 其他技巧
- Python学习之路:函数参数及调用
- 计算机休眠怎么唤醒,电脑休眠后,就无法唤醒了?怎么办?快速教你解决这个问题...
- 第二节:简易安装 和 快速入门Vue.js
- jquery梳理之常用选择器
- Git@OSC 已经支持 Gitlab Control 移动客户端
- 如何在Java中执行Python模块?从认识JEP库开始
- php redis 菜鸟,安装redis和phpredis模块
- gulp-livereload组件使用
- 一个链接泄露这么多隐私,你还敢拼多多助力吗?
- 男人心疼女人的13种方式
- 基于国产银河飞腾多核 DSP +FPGA的图像识别硬件设计与算法实现
- mca版Quiver快速入门
- android 验证邮箱格式,android开发中, 如何验证邮箱的格式 ?
- CSS3 3D变换--扑克牌翻转
- 简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试
- 【ClickHouse】<Error> Application: Caught exception while loading metadata: Code: 231. DB::Exception
- 论文阅读笔记:Recent Advances and Challenges in Task-oriented Dialog Systems
热门文章
- 3行代码Python搞定图片清晰度识别,原来我们看到不一定是这样的
- 计算机视觉论文-2021-09-10
- 9篇!悉尼科技大学入选CVPR2021都研究什么?
- MIT最新课程:一文看尽深度学习各领域最新突破(附视频、PPT)
- 基于Bounding Box的激光点云聚类
- C++ vector类型要点总结(以及各种algorithm算法函数)
- p20怎么用android auto,奔驰23P/P20驾驶辅助系统到底有哪些功能,怎么使用?
- fifo的valid信号啥时候为高_五角枫啥时候适合移栽?五角枫移栽最佳时间
- 计算机在机械制造领域中的应用论文,高科技在机械制造工艺中的应用论文
- 软考网络管理员学习笔记3之第三章网络体系结构