hdu6230
hdu6230
题意
给出一个字符串,问有多少个子串 \(S[1..3n-2](n \geq 2)\) 满足 \(S[i]=S[2n-i]=S[2n+i-2] (1\leq i \leq n)\) 。
分析
Manacher 算法预处理下以每个下标为中心的最长回文串的长度。
我们要找的子串由两个奇数长度的回文串重叠部分组成,用一个向量数组存下以每个下标作为左端的奇数长度回文串的中心位置,我们可以维护一个树状数组去计算答案。
code
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 10;
char s[MAXN << 1], t[MAXN << 1];
int n, m, num[MAXN << 1];
void init() {
n = strlen(s);
t[0] = '$';
for(int i = 1; i <= 2 * n; i += 2) {
t[i] = '#';
t[i + 1] = s[i / 2];
}
t[2 * n + 1] = '#';
t[2 * n + 2] = '!';
m = 2 * n + 1;
int mx = 0, id = 0;
memset(num, 0, sizeof num);
for(int i = 1; i <= m; i++) {
if(mx > i) num[i] = min(mx - i, num[2 * id - i]);
else num[i] = 1;
while(t[i - num[i]] == t[i + num[i]]) num[i]++;
if(i + num[i] > mx) {
mx = i + num[i];
id = i;
}
}
}
int f[MAXN];
void update(int x) {
while(x < MAXN) {
f[x]++;
x += x & -x;
}
}
int query(int x) {
int res = 0;
while(x) {
res += f[x];
x -= x & -x;
}
return res;
}
vector<int> G[MAXN];
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%s", s);
init();
memset(f, 0, sizeof f);
for(int i = 0; i < n; i++) G[i].clear();
for(int i = 2; i <= m; i += 2) {
int x = i / 2 - 1, r = (num[i] - 1) / 2;
if(t[i] != '#') {
num[x] = r;
if(r) G[x - r].push_back(x);
} else num[x] = 0;
}
long long ans = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < G[i].size(); j++) update(G[i][j]);
ans += query(min(n, i + num[i])) - query(i);
}
printf("%lld\n", ans);
}
return 0;
}
hdu6230的更多相关文章
- hdu6230 Palindrome(manacher+树状数组)
题目链接: Palindrome Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Other ...
- Hdu-6230 2017CCPC-哈尔滨站 A.Palindrome Manacher 主席树
题面 题意:给你一个字符串,问你满足s[i]=s[2n-i]=s[2n+i-2]的子串(这子串长度为3n-2)有多少个,原字符串长度<=5e5 题解:对于这种子串,其实要满足2个回文,跑过一次M ...
随机推荐
- SRM709 div1 Xscoregame(状压dp)
题目大意: 给定一个序列a,包含n个数(n<=15),每个数的大小小于等于50 初始时x = 0,让你每次选a中的一个数y,使得x = x + x^y 问如何安排选择的次序,使得最终结果最大. ...
- Visual Studio调试之符号文件
原文链接地址:http://www.cnblogs.com/killmyday/archive/2009/10/14/1582882.html 前面在不能设置断点的检查步骤和Visual Studio ...
- BZOJ2460 [BeiJing2011]元素 【线性基】
2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1675 Solved: 869 [Submit][St ...
- 安徽师大附中%你赛day4T1 金字塔 解题报告
金字塔 题目背景: \(Zdrcl\)带着妹子们来到了胡夫金字塔周边旅游, 发现这里正在进行一个有关金字塔的游戏 题目描述: 游戏规则如下: 1. 这里的金字塔是一个 \(N\) 阶的二维金字塔. 2 ...
- C++——OOP面向对象理解
从Rob Pike 的 Google+上的一个推看到了一篇叫<Understanding Object Oriented Programming>的文章,我先把这篇文章简述一下,然后再说说 ...
- 强大的JQuery数组封装使用
JQuery对数组的处理非常便捷并且功能强大齐全,一步到位的封装了很多原生js数组不能企及的功能.下面来看看JQuery数组的强大之处在哪. $.each(array, [callback]) 遍历 ...
- hadoop SecondNamenode 详解
SecondNamenode名字看起来很象是对第二个Namenode,要么与Namenode一样同时对外提供服务,要么相当于Namenode的HA. 真正的了解了SecondNamenode以后,才发 ...
- es6+最佳入门实践(13)
13.模块化 13.1.什么是模块化 模块化是一种处理复杂系统分解为更好的可管理模块的方式.通俗的讲就是把一个复杂的功能拆分成多个小功能,并且以一种良好的机制管理起来,这样就可以认为是模块化.就像作家 ...
- 2、Distributed Optimization
一.目录: Distributed dynamic programming (as applied to path-planning problems). Distributed solutions ...
- Spring - IoC(7): 延迟实例化
默认情况下,Spring IoC 容器启动后,在初始化过程中,会以单例模式创建并配置所有使用 singleton 定义的 Bean 的实例.通常情况下,提前实例化 Bean 是可取的,因为这样在配置中 ...