【BZOJ】1524: [POI2006]Pal
题意
给出\(n\)个回文串\(s_i(\sum_{i=1}^{n} |s_i| \le 2000000)\)求如下二元组\((i, j)\)的个数\(s_i + s_j\)仍然是回文串。
分析
这道题其实是一道傻逼hash题,可是为了学习拓展kmp我就写了拓展kmp。
其实我们考虑\(a+b\)如果是回文串,那么\(a\)的前缀肯定和倒过来的\(b\)的后缀相等,然后剩下的肯定也是一个回文串。那么这题就解决了。
题解
将每一个串倒序插入到trie中。然后正序遍历每一个串,然后判断剩下的是否是回文串即可,剩下的是否是回文串可以用拓展kmp,也可以用hash。不过如果用hash的话还有一个更快的方法,就是枚举回文中心,然后统计左边和右边相等的个数,请自己yy把。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2000005;
char s[N+N], rs[N+N], Buf[N+N], *buf=Buf;
int A[N+N], *a=A, c[N][26], tot, sum[N], w[N], nn[N+N];
void getp(char *a, char *b, int na, int nb, int *p, int *q, int flag) {
int add=flag==2;
q[1]=add?na:0;
q[flag]=0;
for(int i=1, g=min(na, nb)-add, &now=q[flag]; i<=g && a[i]==b[i+add]; ++i, ++now);
for(int i=1+flag, x=flag, y=flag+q[flag]-1; i<=na; ++i) {
int L=p[i-x+1], &now=q[i];
if(i+L<=y) {
now=L;
}
else {
y=max(y, i-1);
x=i;
now=y-i+1;
for(; y<na && now<nb && b[now+1]==a[y+1]; ++now, ++y);
}
}
}
void getq(char *a, char *b, int na, int nb, int *q) {
static int p[N];
getp(b, b, nb, nb, p, p, 2);
getp(a, b, na, nb, p, q, 1);
}
inline int getint() {
int x=0;
char ch=*buf++;
for(; ch<'0'||ch>'9'; ch=*buf++);
for(; ch>='0'&&ch<='9'; x=x*10+ch-'0', ch=*buf++);
return x;
}
int main() {
fread(Buf, 1, sizeof Buf, stdin);
int T=getint();
char *ts=s;
for(int t=0; t<T; ++t) {
int n=getint(), x=0;
char *ns=ts++, ch=*buf++;
for(; ch<'a'||ch>'z'; ch=*buf++);
for(; ch>='a'&&ch<='z'; *ts++=ch, ch=*buf++);
for(int i=1; i<=n; rs[i]=ns[n-i+1], ++i);
rs[n+1]=0;
getq(rs, ns, n, n, a);
a[n+1]=-1;
for(int i=1; i<=n; ++i) {
int y=rs[i]-'a';
if(!c[x][y]) {
c[x][y]=++tot;
}
sum[x=c[x][y]]+=a[i+1]==n-i;
}
getq(ns, rs, n, n, a);
a[n+1]=0;
++w[x];
a+=n+1;
nn[t]=n;
}
ll ans=0;
ts=s;
a=A;
for(int t=0, x=0, n, i; t<T; ++t) {
char *ns=ts++;
n=nn[t];
for(i=1, x=0; *ts && (x=c[x][*ts-'a']); ++ts, ++i) {
ans+=w[x]*(a[i+1]==n-i);
}
if(x) {
ans+=sum[x];
}
ts=ns+n+1;
a+=n+1;
}
printf("%lld\n", ans);
return 0;
}
【BZOJ】1524: [POI2006]Pal的更多相关文章
- 【BZOJ】1513: [POI2006]Tet-Tetris 3D
题意 给\(n(1 \le n \le 20000)\)个立方体\((x, y, z)\),依次落下.求所有立方体落下完了以后最高的高度. 分析 平面求最大值,平面更新最大值. 题解 二维线段树走起, ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
- 【BZOJ】【2434】【NOI2011】阿狸的打字机
AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
随机推荐
- PHP define()的用法
define()函数理解1(着重于作用的理解) define() 函数定义一个常量. 常量的特点: 常量类似变量,不同之处在于:在设定以后,常量的值无法更改常量名,不需要开头的美元符号 ($),作用域 ...
- 回溯法解决N皇后问题(以四皇后为例)
以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...
- CXF学习 (1)
Axis(Apache) -> Axis2(Apache) XFire - > CXF (XFire+Celtrix) (Apache) CXF并不仅仅是Webservice框架,更号称是 ...
- PHPCMS V9 栏目列表调用文章点击量及评论数量方法
很多朋友在用Phpcms做站时,具体需要在列表页.首页调用文章列表调用文章的点击量和评论排行,那么怎么才能做到在Phpcms v9首页.频道页.列表页.推荐位等页面获取文章浏览量和评论统计呢? 原因起 ...
- mysql编译时报的一个警告warning: type-punning to incomplete type might break strict-aliasing rules,可能是bug
cmake的时候报了一个警告: /softdb/mysql-5.5.37/storage/innobase/handler/ha_innodb.cc:11870: warning: type-punn ...
- Zigzag convert
public static String Convert(String s,int row) { char[] c=s.toCharArray(); int len=s.length(); Strin ...
- loj 1002(spfa变形)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25828 题意:求所有点到给定的目标顶点的路径上的权值的最大值的最小 ...
- ios换肤思想,及工具类
// 实现原理及思路:不同种类的皮肤放在不同的文件夹下,用一个plist文件存放不同控制器下的控件的背景颜色 //plist文件名称为控制器的名称,内部的数据字典的key value对自定义一个命名规 ...
- 一个简单的Object Hook的例子(win7 32bit)
Object Hook简单的来说就是Hook对象,这里拿看雪上的一个例子,因为是在win7 32位上的,有些地方做了些修改. _OBJECT_HEADER: kd> dt _OBJECT_HEA ...
- JSON详解以及可以把javabean转换成json串的json-lib应用
JSON 1. json是什么 它是js提供的一种数据交换格式! 2. json的语法 {}:是对象! 属性名必须使用双引号括起来!单引不行!!! 属性值:null,数值,字符串,数组:使用[]括起来 ...