题意

给出\(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把。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=2000005;
  5. char s[N+N], rs[N+N], Buf[N+N], *buf=Buf;
  6. int A[N+N], *a=A, c[N][26], tot, sum[N], w[N], nn[N+N];
  7. void getp(char *a, char *b, int na, int nb, int *p, int *q, int flag) {
  8. int add=flag==2;
  9. q[1]=add?na:0;
  10. q[flag]=0;
  11. for(int i=1, g=min(na, nb)-add, &now=q[flag]; i<=g && a[i]==b[i+add]; ++i, ++now);
  12. for(int i=1+flag, x=flag, y=flag+q[flag]-1; i<=na; ++i) {
  13. int L=p[i-x+1], &now=q[i];
  14. if(i+L<=y) {
  15. now=L;
  16. }
  17. else {
  18. y=max(y, i-1);
  19. x=i;
  20. now=y-i+1;
  21. for(; y<na && now<nb && b[now+1]==a[y+1]; ++now, ++y);
  22. }
  23. }
  24. }
  25. void getq(char *a, char *b, int na, int nb, int *q) {
  26. static int p[N];
  27. getp(b, b, nb, nb, p, p, 2);
  28. getp(a, b, na, nb, p, q, 1);
  29. }
  30. inline int getint() {
  31. int x=0;
  32. char ch=*buf++;
  33. for(; ch<'0'||ch>'9'; ch=*buf++);
  34. for(; ch>='0'&&ch<='9'; x=x*10+ch-'0', ch=*buf++);
  35. return x;
  36. }
  37. int main() {
  38. fread(Buf, 1, sizeof Buf, stdin);
  39. int T=getint();
  40. char *ts=s;
  41. for(int t=0; t<T; ++t) {
  42. int n=getint(), x=0;
  43. char *ns=ts++, ch=*buf++;
  44. for(; ch<'a'||ch>'z'; ch=*buf++);
  45. for(; ch>='a'&&ch<='z'; *ts++=ch, ch=*buf++);
  46. for(int i=1; i<=n; rs[i]=ns[n-i+1], ++i);
  47. rs[n+1]=0;
  48. getq(rs, ns, n, n, a);
  49. a[n+1]=-1;
  50. for(int i=1; i<=n; ++i) {
  51. int y=rs[i]-'a';
  52. if(!c[x][y]) {
  53. c[x][y]=++tot;
  54. }
  55. sum[x=c[x][y]]+=a[i+1]==n-i;
  56. }
  57. getq(ns, rs, n, n, a);
  58. a[n+1]=0;
  59. ++w[x];
  60. a+=n+1;
  61. nn[t]=n;
  62. }
  63. ll ans=0;
  64. ts=s;
  65. a=A;
  66. for(int t=0, x=0, n, i; t<T; ++t) {
  67. char *ns=ts++;
  68. n=nn[t];
  69. for(i=1, x=0; *ts && (x=c[x][*ts-'a']); ++ts, ++i) {
  70. ans+=w[x]*(a[i+1]==n-i);
  71. }
  72. if(x) {
  73. ans+=sum[x];
  74. }
  75. ts=ns+n+1;
  76. a+=n+1;
  77. }
  78. printf("%lld\n", ans);
  79. return 0;
  80. }

【BZOJ】1524: [POI2006]Pal的更多相关文章

  1. 【BZOJ】1513: [POI2006]Tet-Tetris 3D

    题意 给\(n(1 \le n \le 20000)\)个立方体\((x, y, z)\),依次落下.求所有立方体落下完了以后最高的高度. 分析 平面求最大值,平面更新最大值. 题解 二维线段树走起, ...

  2. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  3. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  4. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  5. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  6. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  7. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  8. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

  9. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

随机推荐

  1. SQL Server数据库大型应用解决方案总结(转载)

    转载地址:http://hb.qq.com/a/20120111/000216.htm 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天百万级甚至 ...

  2. 使用html5的离线缓存技术

    突然想用html5的离线缓存,但是一直没有成功,在各种群里问发现很多人都没什么经验,最终终于在各种论坛找到解决方案了.下面就简单记录一下相关情况. 一.离线缓存的优点 我们都知道离线缓存主要是用来减少 ...

  3. hdu 4763 kmp ***

    找AEAEA形式的字符串最长的A长度,E可以为空 只可意会,不可言传,懂kmp即可 #include <stdio.h> #include <string.h> #includ ...

  4. Java Security: Illegal key size or default parameters?

    来自:http://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters I ...

  5. windows多线程详解

    转自:http://blog.csdn.net/zhouxuguang236/article/details/7775232 在一个牛人的博客上看到了这篇文章,所以就转过来了,地址是http://bl ...

  6. android用户界面详尽教程实例

    android用户界面详尽教程实例 1.android用户界面之AlarmManager教程实例汇总http://www.apkbus.com/android-48405-1-1.html2.andr ...

  7. javascript settimeout and setinterval

    setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束.如果运行的代码中再次运行同样的setTimeout命令,则可循环运行.setinterval是循环运行的,即每 ...

  8. 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路

    1808: 地铁 Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i ...

  9. 【Web前端】---js调用本地应用程序

    最近进入了一个项目组,向大牛们一起学习如何搞开发,可谓是边开发边学习.就在前两天,我们的项目被领导们验收了一次,顺便给我们提了点新的需求,要求我们能够使用外在设备拍照上传.君要臣死,臣不能不死.更何况 ...

  10. Understanding, Operating and Monitoring Apache Kafka

    Apache Kafka is an attractive service because it's conceptually simple and powerful. It's easy to un ...