P3501 [POI2010]ANT-Antisymmetry
P3501 [POI2010]ANT-Antisymmetry
二分+hash
注意:答案超出int范围
------------
先拿一个反对称串来做栗子:010101
我们可以发现 0101(左边右边各削掉1个),01(左边右边各削掉2个)都是反对称串
多举几个例子,我们可以总结出一个性质:一个反对称串的所有同中心的子串都是反对称串
∴长为 n 的子串中的反对称子串数= n/2
------------
于是我们就可以设计算法了
每次枚举中心点,然后二分查找反对称串的最长长度。
对于反对称的问题,我们可以将主串正序逆序都计算一遍hash值。为了方便逆序的可以直接取反
每次判断时将子串取出,就可以达O(1)判断
复杂度O(nlogn)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
inline int min(int &a,int &b) {return a<b ?a:b;}
const int base=;
char q[]; int n;
ull h1[],h2[],fac[],ans; //自然溢出hash
int main(){
scanf("%d",&n); fac[]=;
scanf("%s",q);
for(int i=;i<=n;++i){
h1[i]=h1[i-]*base+(q[i-]=='');
fac[i]=fac[i-]*base; //通用取串方法:利用fac数组取出子串hash值,其中fac[i]=base^i
}
for(int i=n;i>=;--i) h2[i]=h2[i+]*base+(q[i-]==''); //逆序计算(直接取反)
for(int i=;i<n;++i){
int l=,r=min(i,n-i),mid;
while(l<r){ //二分查找长度的一半
mid=l+((r-l)>>)+;
ull p1=h1[i+mid]-h1[i-mid]*fac[mid*];
ull p2=h2[i-mid+]-h2[i+mid+]*fac[mid*]; //取出子串
if(p1==p2) l=mid;
else r=mid-;
}
ans+=l;
}cout<<ans;
return ;
}
P3501 [POI2010]ANT-Antisymmetry的更多相关文章
- 【BZOJ】【2084】【POI2010】Antisymmetry
		Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ... 
- [洛谷P3501] [POI2010]ANT-Antisymmetry
		洛谷题目链接:[POI2010]ANT-Antisymmetry 题目描述 Byteasar studies certain strings of zeroes and ones. Let be su ... 
- 后缀数组&manachar总结
		洛谷题单 后缀数组 前置芝士 后缀数组 1 后缀数组 2 后缀数组 3 例题略解 P2463 [SDOI2008]Sandy的卡片 板子题... 然而我还是不会. 大概做法就是先把所有的串差分后拼成一 ... 
- BZOJ2084: [Poi2010]Antisymmetry
		2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 187 Solved: 125[Submit] ... 
- BZOJ 2084: [Poi2010]Antisymmetry [Manacher]
		2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 609 Solved: 387[Submit] ... 
- 【BZOJ2084】[Poi2010]Antisymmetry(manarcher)
		[BZOJ2084][Poi2010]Antisymmetry(manarcher) 题面 BZOJ 洛谷 题解 一眼马拉车吧...明显就是在回文串的基础上随便改了改. 似乎还可以魔改回文树,然而我这 ... 
- [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: 1205 Solved: 756[Submit ... 
- 「POI2010」反对称 Antisymmetry (manacher算法)
		# 2452. 「POI2010」反对称 Antisymmetry [题目描述] 对于一个 $0/1$ 字符串,如果将这个字符串 $0$ 和 $1$ 取反后,再将整个串反过来和原串一样,就称作「反对称 ... 
随机推荐
- ubuntu查看隐藏文件夹
			打开所要查看的文件目录,然后ctrl + h 快捷键可以显示隐藏文件 例如在/home目录下可以看到以下隐藏文件 
- Pandas的loc方法
			当你读取到DataFrame的数据时,想去定位某一个数据项,可以使用loc方法进行查找,之后你可以赋值给他. import pandas as pd df = pd.read_csv('file_na ... 
- iOS常用基础框架
			一,简述 1.1,IOS操作系统的层次架构 iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer( ... 
- Dungeon Master---2251(bfs)
			http://poj.org/problem?id=2251 有一个三维的牢房地图 求从S点走E点的最小时间: #include<stdio.h> #include<string.h ... 
- compass利用koala在chrome开启scss调试
			compass不生成maps文件,所载调试css上,极不方便.看到下图的调试方式,怎么做. 利用用koala来解决,具体步骤如下: 1.确保自己安装了ruby和sass,compass.接着安装 co ... 
- qt——c++环境下qt编程,类的声明与构造
			在c++中创建项目时,会生成以项目名字命名的QMainWindow,以及相应的头文件和CPP文件,作为主要窗口: 在项目中继续生成qt类时,比如类的名称是test,会自动生成一个test.h的头文件, ... 
- 自定义Metrics:让Prometheus监控你的应用程序
			前言 Prometheus社区提供了大量的官方以及第三方Exporters,可以满足Prometheus的采纳者快速实现对关键业务,以及基础设施的监控需求. 如上所示,一个简单的应用以及环境架构.一般 ... 
- Java-idea-eclipse-快捷键【mac,win】
			Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ... 
- Vue 命令
			vue是数据渲染使用:axios,官网:https://www.kancloud.cn/yunye/axios/234845 || https://www.npmjs.com/search? ... 
- 查看Django和flask版本
			查看Django版本 检查是否安装成功,可以在dos下查看Django版本. 1.输入python 2.输入import django 3.输入django.get_version() 1 2 3 4 ... 
