【哈希 二分】bzoj2084: [Poi2010]Antisymmetry
可以用manacher或者SA搞过去的;非常有趣的hash题
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
题目分析
暂时只会哈希做法……
观察到一个性质:若一个区间为反对称子串,那么这个子串的任意一个子串也是反对称子串。并且奇数长度的区间是一定非法的。
有了这个单调性,就能够枚举中间点,对最长子串长度进行二分了。
#include<bits/stdc++.h>
typedef unsigned long long ull;
const int maxn = ;
const ull base = ; int n;
char s[maxn];
ull power[maxn],lhsh[maxn],rhsh[maxn],ans; bool equal(int l, int r)
{
return lhsh[r]-lhsh[l]*power[r-l]==rhsh[l]-rhsh[r]*power[r-l];
}
int main()
{
scanf("%d%s",&n,s+);
power[] = ;
for (int i=; i<=n; i++)
power[i] = power[i-]*base, lhsh[i] = (lhsh[i-]*base)+(s[i]-'');
for (int i=n; i; i--)
rhsh[i] = (rhsh[i+]*base)+-(s[i]-'');
for (int i=; i<=n; i++)
{
int l = , r = std::min(i, n-i), pos = ;
for (int mid=(l+r)>>; l<=r; mid=(l+r)>>)
if (equal(i-mid+, mid+i)) l = mid+, pos = mid;
else r = mid-;
ans += pos;
}
printf("%lld\n",ans);
return ;
}
此外还有改进的manacher做法?
#include<bits/stdc++.h>
using namespace std;
const int maxx=;
int n,f[maxx],mid=,r=;
long long ans;
char s[maxx];
int main(){
// freopen("x.in","r",stdin);
scanf("%d%s",&n,s+);s[]=s[n+]='';
for(int i=;i<=n;i++){
if(i<r)f[i]=min(r-i+,f[(mid<<)-i]);else f[i]=;
while(abs(s[i+f[i]]-s[i-f[i]-])==)++f[i];
if(i+f[i]->r)mid=i,r=i+f[i]-;
ans+=f[i];
}
printf("%lld",ans);
return ;
} copyright @MikuKnight
END
【哈希 二分】bzoj2084: [Poi2010]Antisymmetry的更多相关文章
- 【二分答案】【字符串哈希】bzoj2084 [Poi2010]Antisymmetry
显然只有偶数长度的串符合题意,并且如果一个串符合题意,那么从其首尾各截掉一个字符也符合题意. 于是枚举中心,二分可以向左右扩展的最远距离,累计答案. #include<cstdio> #i ...
- [BZOJ2084][Poi2010]Antisymmetry 二分+hash
2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 812 Solved: 503[Submit] ...
- BZOJ2084: [Poi2010]Antisymmetry
2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 187 Solved: 125[Submit] ...
- BZOJ2084 [Poi2010]Antisymmetry Manachar
题目传送门 - BZOJ2084 题解 对于一个0我们把它看作01,1看作10,然后只要原串中的某个子串可以通过这两个变换成为回文串就可以满足条件了. 对于转换过的串,Manachar随便弄几下就可以 ...
- BZOJ2084[Poi2010]Antisymmetry——回文自动机
题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...
- 【BZOJ2084】[Poi2010]Antisymmetry(manarcher)
[BZOJ2084][Poi2010]Antisymmetry(manarcher) 题面 BZOJ 洛谷 题解 一眼马拉车吧...明显就是在回文串的基础上随便改了改. 似乎还可以魔改回文树,然而我这 ...
- 【bzoj2084】[Poi2010]Antisymmetry
2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1205 Solved: 756[Submit ...
- bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp)
bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp) bzoj Luogu 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一 ...
- BZOJ 2084: [Poi2010]Antisymmetry [Manacher]
2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 609 Solved: 387[Submit] ...
随机推荐
- 编译最新linux内核(version 4.4.2)
环境:centos6.4 内核版本为2.6.32 目标:编译4.4.2内核,升级到 4.4.2 准备工作: 安装开发库和ncurses库 # yum groupinstall "Develo ...
- Python小世界:彻底搞懂Python一切皆对象!!!
前言 犹记得当初学习Python的时候,对于Python一切皆对象很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的 ...
- Java 多线程高并发编程 笔记(二)
1. 单例模式(在内存之中永远只有一个对象) 1.1 多线程安全单例模式——不使用同步锁 public class Singleton { private static Singleton sin=n ...
- 查找库中的某个函数,grep命令的用法。
程序中调用了某个库中的函数,我想知道这个函数具体的作用,就必须去看这个库的源代码. 那么问题来了:如何从库中众多的.h文件中,得知我想要的函数在哪个文件里? 最后用grep命令成功解决. 具体用法:先 ...
- jqeury实现全选和反选
注意:对于input获取属性不能用attr(),只能用prop().不然出现undefined. 第一版: <!DOCTYPE html> <html lang="en&q ...
- python进阶02 特殊方法与特殊属性
python进阶02 特殊方法与特殊属性 一.初始化.析构 1.初始化 # python中有很多双下划线开头且以下划线结尾的固定方法,它们会在特定的时机被触发执行,这便是特殊方法 # 在实例化的时候就 ...
- MySQL数据库(4)
子查询,MYSQL创建用户和授权,可视化工具N啊vicat的使用,pymysql模块的使用
- 前端JavaScript(2) --常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍
昨日内容回顾 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...
- 线程池(5)Executors.newScheduledThreadPool
例子1(scheduleAtFixedRate):延迟2秒后,每隔3秒执行1次 ScheduledExecutorService es = Executors.newScheduledThreadPo ...
- Redis 基础特性讲解
目录 1.Redis基础杂项小节 1.是什么 2.能干嘛 3.去哪下 4.Redis启动后基础知识讲解 2.Redis数据类型 1.常用的五大数据类型 2.高级'玩家'才知道的其他数据类型 3.Red ...