http://www.spoj.com/problems/STC02/en/

题意:给出一个长度为n的字符串,问其中有多少个子串s可以使得s = s按位取反+翻转。

例如样例:11001011.

10可以,因为取反 = 01,翻转 = 10. 所以算一个。

思路:可以看成是回文串,使用Manacher算法求解。

当向两边扩张的时候,判定条件修改成左边是1或者0,右边就是0或者1,或者都是#。

因为那个子串一定是偶数长度,刚好就是s[i] = '#'的时候就更新答案,该位置的回文串对答案的贡献就是本身不包含'#’的长度,因此是p[i] / 2.

有一个点WA了很久。就是只有s[i] = '#'的时候才可以更新mx。为什么要这样呢?

看这个样例就明白了:011

变成:$#0#1#1#

如果不加判定条件的话,扫到第一个1的时候,p[4] = 4,这个时候mx会更新到右端点。

那么等到p[5]的时候,就会变成p[5] = 3,因为执行了 if(mx > i) p[i] = min(p[id*2-i], mx - i); 这个语句。

但是事实上p[5]是不能向外扩张的,p[5] = 1。

还是需要多考虑细节上的问题啊。

 #include <bits/stdc++.h>
using namespace std;
#define N 500010
int p[N*];
char str[N], s[N*]; bool check(char c1, char c2) {
if(c1 == '' && c2 == '' || c1 == '' && c2 == '' || c1 == '#' && c2 == '#') return true;
return false;
} int main() {
int n;
scanf("%d", &n);
scanf("%s", str);
int len = ;
s[len] = '$'; s[++len] = '#';
for(int i = ; i < n; i++) { s[++len] = str[i]; s[++len] = '#'; }
int mx = , id = ;
long long ans = ;
for(int i = ; i <= len; i++) {
if(mx > i) p[i] = min(p[id*-i], mx - i);
else p[i] = ;
while( <= i - p[i] && i + p[i] <= len && check(s[i-p[i]], s[i+p[i]])) p[i]++;
if(s[i] == '#') {
ans += p[i] / ;
if(mx < p[i] + i) { mx = p[i] + i; id = i; } // 只有s[i]为'#'才可以更新mx
}
}
for(int i = ; i <= len; i++) printf("%d: %c %d\n", i, s[i], p[i]);
printf("%lld\n", ans);
return ;
}

SPOJ STC02 - Antisymmetry(Manacher算法求回文串数)的更多相关文章

  1. LOJ 2452 对称 Antisymmetry——用hash求回文串数

    概念 用hash求最长回文串/回文串数 首先,易知,回文串具有单调性. 如果字符串 $s[l...r]$ 为回文串串,那么 $s[x...y]$($l < x, y < r$ 且 $|l- ...

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

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

  3. Manacher算法求回文半径

    http://wenku.baidu.com/link?url=WFI8QEEfzxng9jGCmWHoKn0JBuHNfhZ-tKTDMux34CeY8UNUwLVPeY5HA3TyoKU2XegX ...

  4. 马拉车算法——求回文串起点hdu3294

    #include<bits/stdc++.h> using namespace std; #define maxn 500005 int p[maxn]; ]; int start; in ...

  5. Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version)(Manacher算法+输出回文字符串)

    This is the hard version of the problem. The difference is the constraint on the sum of lengths of s ...

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

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

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

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

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

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

  9. manacher算法,求回文串

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

随机推荐

  1. 文字滚屏控件(SliderPanel)

    http://www.delphifans.com/infoview/Article_629.html 日期:2005年9月6日 作者:arhaha {==================== 满天星 ...

  2. 人像美妆---妆容迁移算法研究(Makeup transfer)

    原文:人像美妆---妆容迁移算法研究(Makeup transfer) 对于人像美妆算法,现在的美妆相机.玩美彩妆之类的app已经做的比较成熟了,但是具体算法,基本网络上是杳无可查,今天本人介绍一种自 ...

  3. 错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.

    原文:错误:"ResourceDictionary"根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序.请移除 MouseLeftButtonDown 事件的事 ...

  4. Win10《芒果TV》商店版更新v3.2.4:新增跨年事件直播、电视台直播,新年快乐

    听说半个娱乐圈都来了,<芒果TV>UWP版邀您一起,于2016年12月31日晚,观看<湖南卫视2016·2017跨年演唱会>直播,请更新v3.2.4版,主要新增大事件直播和电视 ...

  5. Win10《芒果TV》商店版更新v3.2.0:全新播放体验,跟着爸爸,想去哪就去哪

    喜迎十一月黑五大促,跟着爸爸,想去哪就去哪,<芒果TV>UWP版迅速更新v3.2.0版,全新播放页华丽蜕变,新增互动评论.猜你喜欢.宽窄屏适配.多窗体模式切换. 芒果TV UWP V3.2 ...

  6. Android 9.0 Dialog不显示

    Tester报了一个bug,大概如下: 页面:Activity1 dialog1(半透明遮罩样式) Activity2 dialog2 场景:Activity1弹出dialog1,dialog1弹出a ...

  7. AndroidStudio问题汇总

    1.Error:Execution failed for task ':app:preDebugAndroidTestBuild'.> Conflict with dependency 'com ...

  8. Raknet是一个基于UDP网络传输协议的C++网络库(还有一些其它库,比如nanomsg,fastsocket等等)

    Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务.通常情况下用于游戏,但也可以用于其它项目. Raknet有以下好处: 高性能 在同一台计算机 ...

  9. MinGW和MSYS区别和关系以及MinGW&MSYS在Win7中安装并编译x264

    http://blog.csdn.net/freeape/article/details/50555003

  10. Unity 入門 - 延遲解析

    本文大纲: 小引 共享的范例代码 使用 Lazy<T> 使用自动工厂 注入自定义工厂 小引 当我们说「解析某个型别/组件」时,意思通常是呼叫某类别的建构函式,以建立其实例(instance ...