HDU 6230 Palindrome ( Manacher && 树状数组)
题意 : 给定一个字符串S,问你有多少长度为 n 的子串满足 S[i]=S[2n−i]=S[2n+i−2] (1≤i≤n)
参考自 ==> 博客
分析 : 可以看出满足题目要求的特殊回文子串其实是根据 n 以及 2*n-1 对称的,如图所示

如果我设第一个对称点为 i 第二个为 j ,p[i] 为以 i 为中心是回文半径, 那满足题目条件的子串必定满足 j − p[j] + 1 ≤ i < j ≤ i + p[i] − 1
简单点说就是两点的回文半径要相互覆盖
p[]数组很容易使用 Manacher 算法算出来,那么该如何去找答案?(当时就是想到马拉车,然后完全不知道怎么快速找答案,我好菜啊!)
我们从小到大枚举 j , 对于它左边的所有的点找出满足条件的 i ,即 i + p[i] >= j ,那么我哪知道 j 左边的哪些点是能够成为满足条件的 i ?
由于是从小到大更新,我们将枚举过的 j 装进一个根据 j + p[j] 长度升序的优先队列中,然后使用树状数组在 j 这个点更新贡献 + 1
在枚举下一个 j 的时候,我们将优先队列里面的元素一个个取出来(优先队列里面的元素其实就是现在 j 左边的点),取出来有我们需要去掉不满足条件的点 即 覆盖不到当前 j 的点,直到队头点满足条件或者队列为空,然后对于枚举的每一个 j 贡献出来的答案就是树状数组的前缀和 sun(i) - sum(i-p[i]-1)
可能说的不太清楚,具体看看代码吧,看完了应该就懂了!
#include<bits/stdc++.h>
#define lowbit(i) (i&(-i))
using namespace std;
+ ;
];
], id, mx=;
int c[maxn];
int Init()
{
int len = strlen(s);
sNew[] = '$';
sNew[] = '#';
;
; i < len; i++){
sNew[j++] = s[i];
sNew[j++] = '#';
}
sNew[j] = '\0';
return j;
}
int Manacher()
{
int len = Init();
;
mx = ;
; i < len; i++){
* id - i], mx - i);
;
while (sNew[i - p[i]] == sNew[i + p[i]]) p[i]++;
if (mx < i + p[i]){
id = i;
mx = i + p[i];
}
}
return len;
}
inline void add(int i, int val)
{
){
c[i] += val;
i += lowbit(i);
}
}
int sum(int i)
{
;
){
ret += c[i];
i -= lowbit(i);
}
return ret;
}
struct cmp{
bool operator () (int &A, int &B) const{
return A + p[A] > B + p[B];
};
};
priority_queue<int, vector<int>, cmp> que;
int main(void)
{
int nCase;
scanf("%d\n", &nCase);
while(nCase--){
scanf("%s", s);
int len = Manacher();
, j=; j<len; i++,j+=)
p[i] = p[j]/ - ;
while(!que.empty()) que.pop();
memset(c, , sizeof(c));
;
; i<=(len-)/; i++){
// printf("%d ", p[i]);
while(!que.empty()){
int now = que.top();
if(now + p[now] < i){///去掉不合格的点!
add(now, -);
que.pop();
}else break;
}
ans += sum(i) - sum(i-p[i]-);
que.push(i);
add(i, );
}//puts("");
printf("%lld\n", ans);
}
;
}
瞎 : 马拉车的 p[ ] 数组还有几个特性!
p[i]-1 为以 i 为中心的回文长度
p[i]/2 表示回文半径
i%2==0 表示这个位置为字符,i/2-1 表示原字符串的位置
i%2==1 表示为字符中间,这两边的字符在原字符串的位置分别为 i/2-1 和 i/2
HDU 6230 Palindrome ( Manacher && 树状数组)的更多相关文章
- hdu6230 Palindrome(manacher+树状数组)
题目链接: Palindrome Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Other ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- 【BZOJ-3790】神奇项链 Manacher + 树状数组(奇葩) + DP
3790: 神奇项链 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 304 Solved: 150[Submit][Status][Discuss] ...
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- HDU 3333 Turing Tree (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...
- HDU 4325 Flowers(树状数组+离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...
- hdu 5775 Bubble Sort 树状数组
Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...
- 【bzoj2565】最长双回文串 Manacher+树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6802558.html 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc ...
- HDU - 1541 Stars 【树状数组】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...
随机推荐
- FacertGrid()的使用
查看数据的前五行 tips = sns.load_dataset("tips") tips.head() 引入数据,布置横向画布 g = sns.FacetGrid(tips, c ...
- 【Python】关于近期爬虫学习的总结
写在开头 在之前的三篇文章中,我尝试了使用python爬虫实现的对于特定站点的<剑来>小说的爬取,对于豆瓣的短评的爬取,也有对于爬取的短评数据进行的词云展示,期间运用了不少的知识,现在是时 ...
- 应用安全 - 工具 | 平台 - Weblogic - 漏洞 - 汇总
控制台路径 | 弱口令 前置条件 /console CVE-2016-0638 Date 类型远程代码执行 影响范围10.3.6, 12.1.2, 12.1.3, 12.2.1 CVE-2016 ...
- ubuntu server安装的一些坑
[没有root用户] ubuntu server安装的时候要你新建一个用户,安装完成后,你需要手动开启root. $ sudo passwd root 输入你当前用户的密码 输入你希望的root用户的 ...
- Spark集成的包与引入包冲突
今天在编写Spark应用的时候,想把处理结果输出为JSON字符串,查到Java比较常用的JSON处理包gson,按照其API编写代码后运行程序,总是出现"NoSuchMethodExcept ...
- net 架构师-数据库-sql server-002-工具
本章讲述的工具包括: SQL Server 联机丛书 SQL Server配置管理器 SQL Server Management Studio SQL Server Business Intellig ...
- nrm安装与配置
nrm安装与配置:https://blog.csdn.net/anway12138/article/details/79455224
- Springcloud 2.x 版本 分布式配置中心
一.什么是分布式配置中心? 就是为微服务架构中的微服务提供集中化的外部配置支持,配置中心为各个微服务应用的所有环境提供了中心化的外部配置(可能比较难理解,想知道是什么意思就要知道为什么这么配置:这么配 ...
- JetBrains视图
三种视图模式:
- Python 入门之编码
Python 入门之编码 1.编码初识: (1)ASCII码 :256 个 英文1个字节,不支持中文 (2)GBK(国标) : 英文1个字节 中文两个字节 (3)unicode (万国码):英文4个字 ...