【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序列,求出其中异或意义下回文的子串数量. 题解 我们可以看出,这个其实是一个对于异或意义下的回文子串数量的统计,什么是异或意义下呢?平常,我们对回文的定义是 ...
随机推荐
- centos 7.xx 安装LAMP环境
一.安装Apache 1.安装yum -y install httpd2.开启apache服务systemctl start httpd.service3.设置apache服务开机启动systemct ...
- C++ JSON解析库RapidJSON
https://github.com/Tencent/rapidjson jsontext.txt { "result" : [ { "face_id" : & ...
- android 提示
1.Toast: Toast toast=new Toast(context); Toast.makeText(context, text, duration);//返回值为Toast toast.s ...
- java 获取路径
1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...
- SDUT 3035 你猜我猜不猜你猜不猜(字符串 规律性)
你猜我猜不猜你猜不猜 Time Limit: 2000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 In the past 39th annual ACM in ...
- 网站建设中用JS判断时间并显示不同内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- html5--6-67 阶段练习8-弹性三列布局
html5--6-67 阶段练习8-弹性三列布局 学习要点 运用弹性盒子模型完成一个三列布局,加深对学过知识点的综合应用能力. 了解用百分比设置元素高度的方法. @charset="UTF- ...
- Hadoop学习资料(持续更新)
Alex的Hadoop菜鸟教程 Hadoop资料合集 Hadoop平台和应用程序框架
- 基于 Laravel 5 构建的、支持模块化和多语言的 CMS —— AsgardCMS
1.简介 AsgardCMS 是基于 Laravel 5 构建的.支持模块化和多语言的CMS. 官网:https://asgardcms.com/ Github:https://github.com/ ...
- node npm 总结
是nodejs的软件包管理器,用于node插件管理 npm install <name> [-g] [--save -dev] name:安装模块的名称 -g:全局安装 --save:将保 ...