【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
题意:
求一个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 long char tp[MAXN],str[MAXN<<|];
ll len[MAXN<<|];
inline ll read(){
ll x=,f=;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-;
for(;isdigit(c);c=getchar())
x=x*+c-'';
return x*f;
} inline void solve(ll N){
for(ll i=;i<=N;i++)
str[(i<<)-]='#',str[i<<]=tp[i];
str[N<<|]='#';str[]='!';str[(N<<|)+]='?';
return;
}
inline bool check(char x,char y){return (x=='#'&&y=='#')||(((x-'')^(y-''))==);}
inline ll Manacher(ll N){
ll pos=,lag=,ans=;
for(ll i=;i<=N;i++){
len[i]=(i<lag)?min(lag-i+,len[(pos<<)-i]):;
while(check(str[i+len[i]],str[i-len[i]])) len[i]++;
if(i+len[i]->lag) lag=i+len[i]-,pos=i;
ans+=len[i]>>;//cout<<len[i]<<endl;
}return ans;
} int main(){
ll N=read();cin>>tp+;solve(N);
printf("%lld\n",Manacher(N<<|));
return ;
}
【bzoj2084】[Poi2010]Antisymmetry的更多相关文章
- 【BZOJ2084】[Poi2010]Antisymmetry(manarcher)
[BZOJ2084][Poi2010]Antisymmetry(manarcher) 题面 BZOJ 洛谷 题解 一眼马拉车吧...明显就是在回文串的基础上随便改了改. 似乎还可以魔改回文树,然而我这 ...
- 【BZOJ2087】[Poi2010]Sheep 几何+DP
[BZOJ2087][Poi2010]Sheep Description Lyx的QQ牧场养了很多偶数个的羊,他是Vip,所以牧场是凸多边形(畸形).现在因为他开挂,受到了惩罚,系统要求他把牧场全部分 ...
- 【BZOJ2095】[Poi2010]Bridges 动态加边网络流
[BZOJ2095][Poi2010]Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个 ...
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
[BZOJ2081][Poi2010]Beads Description Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...
- 【BZOJ2083】[Poi2010]Intelligence test 二分
[BZOJ2083][Poi2010]Intelligence test Description 霸中智力测试机构的一项工作就是按照一定的规则删除一个序列的数字,得到一个确定的数列.Lyx很渴望成为霸 ...
- 【BZOJ2096】[Poi2010]Pilots 双指针+单调队列
[BZOJ2096][Poi2010]Pilots Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串, ...
- 【BZOJ2095】[Poi2010]Bridges
[BZOJ2095][Poi2010]Bridges 题面 darkbzoj 题解 首先可以想到二分答案,那么我们就是要求我们新图中给所有边定向是否存在欧拉回路. 而有向图存在欧拉回路的充要条件为所有 ...
- bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp)
bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp) bzoj Luogu 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一 ...
- 【BZOJ2084】【洛谷P3501】[POI2010]ANT-Antisymmetry(Manache算法)
题意描述 原题: 一句话描述:对于一个0/1序列,求出其中异或意义下回文的子串数量. 题解 我们可以看出,这个其实是一个对于异或意义下的回文子串数量的统计,什么是异或意义下呢?平常,我们对回文的定义是 ...
随机推荐
- Redis HyperLogLog及应用
参考:http://www.runoob.com/redis/redis-hyperloglog.html Redis 在 2.8.9 之后的版本中,添加了 HyperLogLog 结构,用来做基数统 ...
- openwrt: sysupgrade
sysupgrade 用法: sysupgrade [...] sysupgrade [-q] [-i] 升级选项: -d 重启前等待 delay 秒 -f 从 .tar.gz (文件或链接) 中恢复 ...
- iOS UIButton选中状态切换
UIButton*payBtn = [UIButtonbuttonWithType:UIButtonTypeCustom]; payBtn.frame=CGRectMake(size.width-24 ...
- H5新增表单属性
一.form属性 <form id="test"> <input type="text" placeholder="请输入合适的信息 ...
- Apache Qpid 高可用集群
一.RHCS RHCS是Red Hat Cluster Suite(红帽子集群套件)的缩写.RHCS是一个功能完备的集群应用解决方案,它从应用的前端访问到后端的数据存储都提供了一个行之有效的集群架构实 ...
- Android开发之中的一个个简单的通讯录实现(源代码)
通讯录就是一个ListView.我们须要通过数据库和ContentProvider来活动通讯录的数据.当然,我们应该提供选中后编辑的功能. 非常easy的一个通讯略Demo,所以.直接上代码,须要的看 ...
- EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- PPAPI与Browser间使用AsyncIPC通信
採用AsyncIpc这个项目(https://github.com/hicdre/AsyncIpc).来完毕PPAPI Plugin进程与Browser进程的通信. foruok原创.如需转载请关注f ...
- RSA前端JS加密,后端JAVA解密实现
用RSA非对称加密方式实现.后台生成rsa密钥对,然后在页面设置rsa公钥,提交时用公钥加密密码,生成的密文传到后台,后台再用私钥解密,获取密码明文.这样客户端只需要知道rsa加密方式和公钥,前台不知 ...
- maven统一配置
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...