【题目链接】

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. javaweb和数据库的简易商城系统

    这是一个基于Javaweb和数据库的简易商城系统.为大二夏季小学期完成. 目录结构 主要功能截图为: 一.购买用户 1.首页(除此界面其余界面访问需要登录才能进入) 查看商品 添加购物车 查看购物车 ...

  2. python3连接redis数据库

    1.python想操作redis,需要安装第三方模块(我是在windows下进行操作的) pip install redis 2.连接数据库 #coding:utf-8 import redis r  ...

  3. js base64编码,C#解码

    JS: this.Base64 = function (str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, fu ...

  4. 巨丑vue

    <template> <div> <div class="demo-type" align="right" style=" ...

  5. git push and git pull

    原文链接 git push 通常对于一个本地的新建分支,例如git checkout -b develop, 在develop分支commit了代码之后,如果直接执行git push命令,develo ...

  6. div设置百分比高度 宽度

    给div按百分比设置高度 宽度两种方法: 第一种是给body标签设置他的高度值,xxxpx,div就会根据body的像素值取百分比: 第二种方法就是在div属性中加入 position:absolut ...

  7. centos7 下设置 mongodb 开机启动 (重点)

    centos 7的开机启动跟之前版本的centos有很大不同.现在用 systemctl命令代替了之前的chkconfig 和 service 命令 注册到开机启动的方法如下: 在系统服务目录下新建m ...

  8. Horovod 通信策略

    因为最近的工作要和Horovod打交道,所以分析了Horovod的源码.在这里记一笔. Horovod有几个亮点,第一,它不依托于某个框架,自己通过MPI建立了一套分布式系统,完成了allreduce ...

  9. Hibernate3核心API简介-Transaction接口

    代表一次原子操作,它具有数据库事务的概念.所有持久层都应该在事务管理下进行,即使是只读操作.    Transaction tx = session.beginTransaction();常用方法:c ...

  10. sublime的简单配置(解决为什么package control无效)

    1:下载sublime text 3 要到它的官网下载,要英文的. 2:安装sublime的包. 进入sublime按快捷键ctrl+~(~是键盘左上角Esc下面的键). 3:在这里面输入如下代码.( ...