题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=784

题意:

给你一个串s,求出满足S[i]=S[2n−i]=S[2n+i−2] (1≤i≤n)的超级回文子串有多少个

题解:

设p[i]为以第i个字符为中心的回文串半径-1

那仔细分析下题目,就会发现如果存在两个点(i, j)满足j-i<=min(p[i], p[j]),那么j和i就是一个超级回文子串的两个中心

所有这题就是求有多少对(i, j)满足j-i<=min(p[i], p[j])

考虑枚举i以p[i]为半径算贡献,显然贡献就是半径内所有满足j-i<=p[j]的j的个数,移项得p[j]-j>=-i

所以先令p[j] = p[j]-j,之后从大到小将p[]添加到数组中,用树状数组统计已经加入的p[]的个数即可

//2017CCPC哈尔滨--A
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define LL long long
vector<int> G[500005];
int n, p[1000010], tre[500005];
char s[500010], str[1000010];
int Query(int x)
{int ans = 0;while(x){ans += tre[x];x -= x&-x;}return ans;
}
void Update(int x, int val)
{while(x<=n){tre[x] += val;x += x&-x;}
}
int main(void)
{LL ans;int T, i, j, k, mx, id;scanf("%d", &T);while(T--){scanf("%s", s);n = strlen(s);str[0] = '$';str[1] = '#';for(i=0;i<=n-1;i++){k = (i+1)*2;str[k] = s[i];str[k+1] = '#';}n = k+1;str[n+1] = 0;mx = 0;for(i=1;i<=n;i++){p[i] = 1;if(mx>i)p[i] = min(p[2*id-i], mx-i+1);while(str[i+p[i]]==str[i-p[i]])p[i]++;if(p[i]+i-1>mx){mx = p[i]+i-1;id = i;}}k = 1;for(i=2;i<=n;i+=2){p[k] = k+1-p[i]/2;G[k+1-p[i]/2].push_back(k);k += 1;}n = k-1;ans = 0;for(i=1;i<=n;i++){for(j=0;j<G[i].size();j++)Update(G[i][j], 1);G[i].clear();ans += Query(min(i+i-p[i], n))-Query(i);}G[i+1].clear();memset(tre, 0, sizeof(tre));printf("%lld\n", ans);}return 0;
}
/*
125
ababcbabccbaabc
abcbabc
abab
*/

2017CCPC哈尔滨 A:Palindrome(manacher+树状数组)相关推荐

  1. power oj 2840: 伯陵防线 思维+树状数组

    2840: 伯陵防线 Time Limit: 1000 MS Memory Limit: 262144 KB Total Submit: 9 Accepted: -4 Page View: 81 Su ...

  2. E:Three Blocks Palindrome(hard and easy)(树状数组 ? 前缀和?)

    Three Blocks Palindrome (hard version) 思路 考虑到每个数字的范围是12001 ~ 2001 200,于是我们可以通过枚举两侧的元素来寻找最优答案. 我们有一个贪 ...

  3. hdu 5157(manacher+前缀和+树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5157 解题思路: 我们可以先用mancher算法对字符串进行处理,把以每个点为中心的回文串半径求出来, ...

  4. Gym - 101755G Underpalindromity (树状数组)

    Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...

  5. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  6. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  7. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  8. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  9. poj_3067 树状数组

    题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...

最新文章

  1. 机器学习中特征选择怎么做?这篇文章告诉你
  2. .net 转换任意类型不报错
  3. 日记:2019-07-28
  4. 禁用Browser Link
  5. 系统目录结构,文件类型
  6. 单IP无TMG拓扑Lync Server 2013:活动目录
  7. 使用相对长度单位em布局网页内容
  8. 解开Future的神秘面纱之任务执行
  9. jasypt加密_【Jasypt】给你的配置加把锁
  10. 反射在工厂模式中的使用
  11. 【三维路径规划】基于matlab改进的蝙蝠算法农用无人机三维路径规划【含Matlab源码 1514期】
  12. AHU 超算中心 指令
  13. 4G+5G多卡聚合路由设备解决户外直播网络需求
  14. 支付通道对接常见的问题有哪些?
  15. Linux shell 命令学习 大全
  16. Python datetime time计算时间差
  17. tweepy抓取Twitter数据
  18. 使用Python爬虫爬取简单网页(Python爬虫入门)
  19. 大学生吸烟现象调查报告
  20. python报错:Python 2.7 will reach the end of its life on January 1st, 2020.

热门文章

  1. 学python有前途吗-学python有前途吗?
  2. linux的课程完全看不懂,学习Linux命令神器-看不懂直接给你解释
  3. MongoDB查询文档(非常详细,不要错过哦~)
  4. 移动web-使一个盒子水平垂直居中的六种方法
  5. 变量、属性、函数、方法总结
  6. 【java笔记】可变参数
  7. 【计算机组成原理笔记】计算机的基本组成
  8. MPEG-7实例入门
  9. 交换机的基本配置实验报告_交换机入门配置,最基本的IP及登录方式配置,一分钟了解下...
  10. input回车触发事件_JavaScript学习笔记(十五)—Event事件(上)