可以用manacher或者SA搞过去的;非常有趣的hash题

Description

对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串。比如00001111和010101就是反对称的,1001就不是。
现在给出一个长度为N的01字符串,求它有多少个子串是反对称的。

Input

第一行一个正整数N (N <= 500,000)。第二行一个长度为N的01字符串。

Output

一个正整数,表示反对称子串的个数。

Sample Input

8
11001011

Sample Output

7

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的更多相关文章

  1. 【二分答案】【字符串哈希】bzoj2084 [Poi2010]Antisymmetry

    显然只有偶数长度的串符合题意,并且如果一个串符合题意,那么从其首尾各截掉一个字符也符合题意. 于是枚举中心,二分可以向左右扩展的最远距离,累计答案. #include<cstdio> #i ...

  2. [BZOJ2084][Poi2010]Antisymmetry 二分+hash

    2084: [Poi2010]Antisymmetry Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 812  Solved: 503[Submit] ...

  3. BZOJ2084: [Poi2010]Antisymmetry

    2084: [Poi2010]Antisymmetry Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 187  Solved: 125[Submit] ...

  4. BZOJ2084 [Poi2010]Antisymmetry Manachar

    题目传送门 - BZOJ2084 题解 对于一个0我们把它看作01,1看作10,然后只要原串中的某个子串可以通过这两个变换成为回文串就可以满足条件了. 对于转换过的串,Manachar随便弄几下就可以 ...

  5. BZOJ2084[Poi2010]Antisymmetry——回文自动机

    题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...

  6. 【BZOJ2084】[Poi2010]Antisymmetry(manarcher)

    [BZOJ2084][Poi2010]Antisymmetry(manarcher) 题面 BZOJ 洛谷 题解 一眼马拉车吧...明显就是在回文串的基础上随便改了改. 似乎还可以魔改回文树,然而我这 ...

  7. 【bzoj2084】[Poi2010]Antisymmetry

    2084: [Poi2010]Antisymmetry Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1205  Solved: 756[Submit ...

  8. bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp)

    bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp) bzoj Luogu 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一 ...

  9. BZOJ 2084: [Poi2010]Antisymmetry [Manacher]

    2084: [Poi2010]Antisymmetry Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 609  Solved: 387[Submit] ...

随机推荐

  1. Solidity 最新 0.5.8 中文文档发布

    本文首发于深入浅出区块链社区 热烈祝贺 Solidity 最新 0.5.8 中文文档发布, 这不单是一份 Solidity 速查手册,更是一份深入以太坊智能合约开发宝典. 翻译说明 Solidity ...

  2. js一些练习题

    1 如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1 function indexOf(arr, item) { if(Array.prototype.indexOf){ retur ...

  3. mysql读取不同位置配置文件顺序

    读取顺序为: /etc/my.cnf basedir/my.cnf datadir/my.cnf --defaults-extra-file    #在读取全局配置文件之后,读取用户配置文件(~/.m ...

  4. echart option属性

    option 图表选项,包含图表实例任何可配置选项: 公共选项 , 组件选项 , 数据选项 名称 描述 {color}backgroundColor 全图默认背景,(详见backgroundColor ...

  5. net Core 2.0应用程序发布到IIS

    .net Core 2.0应用程序发布到IIS上注意事项   .net Core2.0应用程序发布window服务器报错容易错过的配置. 1.应用程序发布. 2.IIS上新建网站. 3.应用程序池选择 ...

  6. AD17笔记

    1 铺铜修改后自动重铺设置:在最右下角

  7. 下一代的前端构建工具:parcel打包react

    1. parcel很受欢迎,webpack太慢了,试试Parcel下一代的前端构建工具 2.Parcel很快,但缺少好多插件,没有base64,没有办法拆分打包文件.... 3.总结:适合小项目 4. ...

  8. File类。

    File类: java.io.File 类.是文件和文件夹目录名的抽象表示形式. 可以用File对文件和文件夹进行 创建,删除,获取等操作. File类的一些静态成员变量: static String ...

  9. 如何在github中的readme.md加入项目截图

    1. 先在之前的本地项目文件夹里创建一个存放截图的文件夹.(如img文件夹) 2. 将新增的内容通过github desktop上传到github中 3. 在github中立马能看到刚刚上传的图片,打 ...

  10. redis 大批量数据插入导致MISCONF Redis is configured to save RDB snapshots的解决

    PS:之前写过一遍,那个方法没有彻底解决,现找到真正的解决方法 环境:redis 3.2.100 windows版(注意!!!这是关键),win10,redis客户端spring boot 2.0.7 ...