概念

用hash求最长回文串/回文串数

首先,易知,回文串具有单调性。

如果字符串 $s[l...r]$ 为回文串串,那么 $s[x...y]$($l < x, y < r$ 且 $|l-x| = |r-y|$)也一定是回文串。

因此,可以二分。

通常,枚举一下起点或者中点,然后二分长度。

这样复杂度为 $O(nlogn)$,逊色于马拉车 $O(n)$,但在时限不那么紧的情况下,hash也是不错的选择。

例题

题意:对于一个 0/1 串,如果将这个字符串 0 和 1 取反后,再将整个串反过来和原串一样,就称作「反对称」字符串。先给出一个长为 $n$ 的 0/1 串,求它有多少反对称字串。($1 \leq n\leq 500000$)

分析:

先正向求一遍hash,再反向求一遍hash(0,1互换)。

枚举中点,判断左右两半的hash值是否相同。

显然,不存在长度为奇数的反对称串。

#include <bits/stdc++.h>
using namespace std; typedef unsigned long long ull;
typedef long long ll;
const ull base = ;
const int maxn = 5e5 + ; ull h1[maxn], h2[maxn], p[maxn];
int n;
ll ans;
char s[maxn]; ull get_h1(int l, int r)
{
return h1[r] - h1[l-]*p[r-l+];
}
ull get_h2(int l, int r)
{
return h2[l] - h2[r+]*p[r-l+];
} int check(int x)
{
int l=, r = min(x, n-x);
int ans=;
while(l <= r)
{
int mid = (l+r) >> ;
if(get_h1(x-mid+,x) == get_h2(x+, x+mid))
{
ans = mid;
l = mid + ;
}
else r = mid - ;
}
return ans;
} int main()
{
scanf("%d%s", &n, s+);
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] == '' ? s[i]+ : s[i]-); for(int i = ;i < n;i++) ans += check(i);
printf("%lld\n", ans);
return ;
}

参考链接:https://www.cnblogs.com/henry-1202/p/10321013.html

LOJ 2452 对称 Antisymmetry——用hash求回文串数的更多相关文章

  1. SPOJ STC02 - Antisymmetry(Manacher算法求回文串数)

    http://www.spoj.com/problems/STC02/en/ 题意:给出一个长度为n的字符串,问其中有多少个子串s可以使得s = s按位取反+翻转. 例如样例:11001011. 10 ...

  2. 2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对)

    2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对) https://www.luogu.com.cn/problem/P5041 题意: 给一个字符串 \(S\) ,每 ...

  3. Palindrome - URAL - 1297(求回文串)

    题目大意:RT   分析:后缀数组求回文串,不得不说确实比较麻烦,尤其是再用线段数进行查询,需要注意的细节地方比较多,比赛实用性不高......不过练练手还是可以的.   线段数+后缀数组代码如下: ...

  4. 马拉车,O(n)求回文串

    马拉车,O(n)求回文串 对整个马拉车算法步骤做个总结: 第一步:将每个原字母用两个特殊字符包围如: aaa --> #a#a#a# abab -->#a#b#a#b 同时可以由这个翻倍的 ...

  5. HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

    题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...

  6. manacher算法,求回文串

    用来求字符串最长回文串或者回文串的总数量 #include<map> #include<queue> #include<stack> #include<cma ...

  7. hdu 3294 manacher 求回文串

    感谢: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/ O(n)求给定字符串的以每个位置为中心的回文串长度. 中心思想:每次计算位 ...

  8. hihocoder 1032 manachar 求回文串O(n)

    #include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...

  9. 拓展KMP求回文串

    题目:hdu3613: 题意:有26字母对应的价值,然后给出以个串,把它分成两段字串,如果字串是回文串,串的价值就是每个字符和,不是就为0.求最大价值. 博客 分析:拓展KMP的应用求回文字串. #i ...

随机推荐

  1. java properties文件转义字符和中文乱码解决

    properties文件的分隔符是   =或者 : 第一次出现的就是分割符,第二次出现的也不需要转义,也即是(忽略掉[],只是着重描述字符) [\=]     [\:]   或者  [=]  [:] ...

  2. log4j向指定文件输出日志

    一.log4j.properties中的配置 log4j.logger.cache=INFO,ERROR,batchFile log4j.addivity.batchFile=false log4j. ...

  3. MATLAB 提取图片中的曲线数据重新画图

    注意: 本代码是由[MATLAB R2015b win 32位]编写. 先上代码: %% 清空变量 clear all; clc; %% 取点之后趋势是对的,也就是点与点之间的比例是对的,但是每个点的 ...

  4. Linux02 cd命令以及绝对路径和相对路径

    一.cd 这是一个非常基本,也是大家常用的命令,用于切换当前目录,他的参数就是要切换的目录的路径,可以是绝对路径,也可以是相对路径. cd /home/keshengtao/ 绝对路径 cd ./pa ...

  5. 『Python基础』第7节:基本运算符

    一. 基本运算符 运算按种类可以分为: 算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们只学习算数运算.比较运算.逻辑运算.赋值运算.成员运算 1.1 算数运算 以下假设 ...

  6. SSM整合所需的maven配置文件

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  7. 使用docker搭建reids主从,哨兵。

    Redis主从配置,如果没有真机就要用虚拟机,使用Docke for Windows host网络有问题. 准备: 1.安装虚拟机. 2.下载redis的安装文件:http://download.re ...

  8. 同步IO,异步IO,阻塞,非阻塞的定义与区别

    异步I/O 是指用户程序发起IO请求后,不等待数据,同时操作系统内核负责I/O操作把数据从内核拷贝到用户程序的缓冲区后通知应用程序.数据拷贝是由操作系统内核完成,用户程序从一开始就没有等待数据,发起请 ...

  9. werkzeug/routing.py-Rule源码分析

    Rule类主要用来定义和表示一个URL的模式.主要定义了一些关键字参数,用来改变url的行为.例如:这个url可以接收的请求方法,url的子域名,默认路径,端点名称,是否强制有斜杠在末尾等等 在最开始 ...

  10. JS权威指南读书笔记(一)

    第一章 JavaScript概述 1 JS是一门高端的.动态的.弱类型的编程语言,非常适合面向对象和函数式的编程风格.   第二章 词法结构 1 JS程序是用Unicode字符集编写的. 2 JS是区 ...