【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大是在第几次插入中被插入的……嗯大概就 ...
随机推荐
- SQL Server数据库大型应用解决方案总结(转载)
转载地址:http://hb.qq.com/a/20120111/000216.htm 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天百万级甚至 ...
- 使用html5的离线缓存技术
突然想用html5的离线缓存,但是一直没有成功,在各种群里问发现很多人都没什么经验,最终终于在各种论坛找到解决方案了.下面就简单记录一下相关情况. 一.离线缓存的优点 我们都知道离线缓存主要是用来减少 ...
- hdu 4763 kmp ***
找AEAEA形式的字符串最长的A长度,E可以为空 只可意会,不可言传,懂kmp即可 #include <stdio.h> #include <string.h> #includ ...
- Java Security: Illegal key size or default parameters?
来自:http://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters I ...
- windows多线程详解
转自:http://blog.csdn.net/zhouxuguang236/article/details/7775232 在一个牛人的博客上看到了这篇文章,所以就转过来了,地址是http://bl ...
- android用户界面详尽教程实例
android用户界面详尽教程实例 1.android用户界面之AlarmManager教程实例汇总http://www.apkbus.com/android-48405-1-1.html2.andr ...
- javascript settimeout and setinterval
setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束.如果运行的代码中再次运行同样的setTimeout命令,则可循环运行.setinterval是循环运行的,即每 ...
- 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路
1808: 地铁 Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i ...
- 【Web前端】---js调用本地应用程序
最近进入了一个项目组,向大牛们一起学习如何搞开发,可谓是边开发边学习.就在前两天,我们的项目被领导们验收了一次,顺便给我们提了点新的需求,要求我们能够使用外在设备拍照上传.君要臣死,臣不能不死.更何况 ...
- Understanding, Operating and Monitoring Apache Kafka
Apache Kafka is an attractive service because it's conceptually simple and powerful. It's easy to un ...