【题目链接】

https://loj.ac/problem/2452

【参考博客】

https://blog.csdn.net/xgc_woker/article/details/82904631

【题意】

在原串中找出多少组子串是反对称的,其中反对称的定义为:“该串取反 和 该串逆置是一样的”

【题解】

二分+hash,hash用两遍,记得要用二分判断最长的长度,如果最长的合法的,那么最长的半径长度就是该串为中心的方案数。

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL ;
const int N = 5e5+;
const ULL base = ;
ULL h1[N] , h2[N] , p[N] , ans ;
int n,s[N] ; /*
预处理
前缀hash h1
后缀hash h2
*/
void get_Hash(){
p[] = ;
for(int i=;i<=n;i++){
p[i] = p[i-] * base ;
h1[i] = h1[i-] * base + (ULL) s[i];
}
for(int i=n;i>=;i--){
h2[i] = h2[i+] * base + (ULL) (s[i]^);
}
}
/*
以i为判断的中心,其中[L,R] [x,y] 是两个半径
*/
bool check(int L,int R,int x,int y){
return h1[R] - h1[L-] * p[R-L+] == h2[x] - h2[y+] *p[y-x+] ;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%1d",&s[i]);
get_Hash(); for(int i=;i<=n;i++){
/*
注意确定上下界
下界必须是L=0
上界是到右侧的最短距离或者到左侧的最短距离
*/
int L = , R = min(n-i,i) , Mid ;
while( L < R ){
Mid = L + R + >> ;
if( check(i-Mid+,i,i+,i+Mid) ){
L = Mid ;
}else {
R = Mid - ;
}
}
/*
题目:明确说到,“将这个字符串0和1取反后,再将整个串反过来和原串一样”
事例中“100”并不符合,因为取反是"011",逆置是"001"。
这一事例充分说明奇数串是不可能的。 二分以i为最长的半径,那么比i小的都是它符合题意的反对称的串
*/
ans += L ;
}
printf("%llu\n",ans);
return ;
}

【hash+二分】Antisymmetry的更多相关文章

  1. 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 题意:支持插入一个字符.修改一个字符,查询lcp.(总长度<=100000, 操作< ...

  2. LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)

    题目描述 绿绿和 Yazid 是好朋友.他们在一起做串串游戏. 我们定义翻转的操作:把一个串以最后一个字符作对称轴进行翻转复制.形式化地描述就是,如果他翻转的串为 RRR,那么他会将前 ∣R∣−1个字 ...

  3. POJ 1743 Musical Theme (字符串HASH+二分)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15900   Accepted: 5494 De ...

  4. Codeforces 1090J $kmp+hash+$二分

    题意 给出两个字符串\(s\)和\(t\),设\(S\)为\(s\)的任意一个非空前缀,\(T\)为\(t\)的任意一个非空前缀,问\(S+T\)有多少种不同的可能. Solution 看了一圈,感觉 ...

  5. bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)

    题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...

  6. bnuoj 34990(后缀数组 或 hash+二分)

    后缀数组倍增算法超时,听说用3DC可以勉强过,不愿写了,直接用hash+二分求出log(n)的时间查询两个字符串之间的任意两个位置的最长前缀. 我自己在想hash的时候一直在考虑hash成数值时MOD ...

  7. 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分

    题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...

  8. 140. 后缀数组(hash + 二分 / 后缀数组)

    题目链接 : https://www.acwing.com/problem/content/description/142/ Hash + 二分 #include <bits/stdc++.h& ...

  9. ZZULI 1876: 蛤玮的项链 Hash + 二分

    Time Limit: 6 Sec  Memory Limit: 128 MBSubmit: 153  Solved: 11 SubmitStatusWeb Board Description 蛤玮向 ...

随机推荐

  1. PHP 根据两个坐标计算距离 圆形围栏的计算

    可以应用于圆形电子围栏入 出围栏计算 圆形电子围栏的计算方式是: 根据圆心坐标和当前检查的坐标进行距离计算,如果距离长度超出围栏的半径,则判定为出围栏,反之是在围栏之内 <?php /** * ...

  2. Vue 使用百度地图组件

    npm 安装 npm install vue-baidu-map --save组件官网地址 https://dafrok.github.io/vue-baidu-map/#/

  3. 部署Hadoop2.0高性能集群

    废话不多说直接实战,部署Hadoop高性能集群: 拓扑图: 一.实验前期环境准备: 1.三台主机配置hosts文件:(复制到另外两台主机上) [root@tiandong63 ~]# more /et ...

  4. ARTS打卡计划第十六周

    Algorithms: https://leetcode-cn.com/problems/min-stack/submissions// Review: https://www.infoq.cn/ar ...

  5. tensorflow训练中出现nan

    问题暂记: 之后看 https://blog.csdn.net/qq_23142123/article/details/80526931 https://www.zhihu.com/question/ ...

  6. springboot内置分页技术

    1,在pom.xml中注入分页的配置 <dependency> <groupId>com.github.pagehelper</groupId> <artif ...

  7. handler方法

    post(Runnable) postAtTime(Runnable,long) postDelayed(Runnable long) post类方法允许你排列一个Runnable对象到主线程队列中 ...

  8. Android数据存储的方式

    1. 内部存储    * 路径:  /data/data/包名/    * cache用于存储临时文件,系统内存不足时,清除缓存数据    * files用于存储重要的文件,要用户手动在应用程序列表清 ...

  9. AutoMapUtility

    实体属性自动映射,支持对象间属性值复制和List复制 安装 Install-Package AutoMapUtility -Version 1.0.2 https://github.com/leopa ...

  10. 深度学习之Seq_seq网络

    知识点 """ 机器翻译: 历史: 1.逐字翻译 2.基于统计学的机器翻译 3.循环网络和编码 翻译过程: 输入 -- > encoder -->向量 --& ...