2017 ccpc哈尔滨 A题 Palindrome

题意:

给一个串\(T\),计算存在多少子串S满足\(S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)\)

思路:

很明显这里的回文串长度为奇数,所以用\(manacher\)处理时不需要添加间隔字符

所以这里的\(Len[i]\)表示的就是以\(i\)为中心的回文串向左右最远能延伸的长度

那么\(S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)\)就等价于

找到一对$(i,j), 满足i - Len[i] + 1 <= j < i 且 j + Len[j] - 1 >= i \(
可以用主席树来维护,更简单的方法就是
将\)j + Len[j] - 1按升序排列\(,然后对于\)j$丢到树状数组里查询贡献就好了。

  1. #include<bits/stdc++.h>
  2. #define P pair<int,int>
  3. #define LL long long
  4. using namespace std;
  5. const int maxn = 5e5 + 10;
  6. const int N = 1e6 + 10;
  7. char s[N];
  8. int Len[N];
  9. int lowbit(int x){return x & (-x);}
  10. int tr[N],R;
  11. int getsum(int pos){
  12. int ans = 0;
  13. for(;pos;pos -= lowbit(pos)) ans += tr[pos];
  14. return ans;
  15. }
  16. void up(int pos){
  17. for(;pos <= R;pos += lowbit(pos)) tr[pos]++;
  18. }
  19. void Manacher(char *s){
  20. int len = strlen(s + 1);
  21. s[0] = '#';
  22. int mx = 0,center = 0;
  23. ///mx为当前计算回文串最右边字符的最大值
  24. ///center为取得mx最大值的中心
  25. for(int i = 1;i <= len;i++){
  26. if(mx > i) Len[i] = min(mx - i, Len[2 * center - i]);///考虑i关于center的对称的Len
  27. else Len[i] = 1;
  28. while(s[i - Len[i]] == s[i + Len[i]]) Len[i]++;
  29. if(Len[i] + i > mx) mx = Len[i] + i, center = i; ///更新最右
  30. }
  31. }
  32. struct node{
  33. int x,l;
  34. node(int x,int l):x(x),l(l){};
  35. node(){};
  36. bool operator<(const node &rhs)const{
  37. return l > rhs.l;
  38. }
  39. }q[N];
  40. int main()
  41. {
  42. int T;
  43. scanf("%d",&T);
  44. while(T--){
  45. scanf("%s",s + 1);
  46. Manacher(s);
  47. int len = strlen(s + 1);
  48. R = len;
  49. for(int i = 1;i <= R;i++) tr[i] = 0;
  50. for(int i = 1;i <= len;i++) q[i] = node(i, i + Len[i] - 1);
  51. sort(q + 1, q + len + 1);
  52. int l = 1;
  53. LL ans = 0;
  54. for(int i = len;i >= 1;i--){
  55. while(l <= len && q[l].l >= i) up(q[l++].x);
  56. ans += getsum(i - 1) - getsum(i - Len[i]);
  57. }
  58. printf("%lld\n",ans);
  59. }
  60. return 0;
  61. }

2017 ccpc哈尔滨 A题 Palindrome的更多相关文章

  1. HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)

    题目链接  2017 CCPC Harbin Problem K 题意  给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...

  2. HDU 6268 Master of Subgraph (2017 CCPC 杭州 E题,树分治 + 树上背包)

    题目链接  2017 CCPC Hangzhou  Problem E 题意  给定一棵树,每个点有一个权值,现在我们可以选一些连通的点,并且把这点选出来的点的权值相加,得到一个和. 求$[1, m] ...

  3. HDU 6271 Master of Connected Component(2017 CCPC 杭州 H题,树分块 + 并查集的撤销)

    题目链接  2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块.    分块的时候满足每个块是一个 ...

  4. 2017 CCPC 哈尔滨站 题解

    题目链接  2017 CCPC Harbin Problem A Problem B Problem D Problem F Problem L 考虑二分答案. 设当前待验证的答案为x 我们可以把第二 ...

  5. 2017 CCPC秦皇岛 A题 A Ballon Robot

    The 2017 China Collegiate Programming Contest Qinhuangdao Site is coming! There will be  teams parti ...

  6. 2017 CCPC秦皇岛 M题 Safest Buildings

    PUBG is a multiplayer online battle royale video game. In the game, up to one hundred players parach ...

  7. 2017 CCPC秦皇岛 L题 One Dimensions Dave

    BaoBao is trapped in a one-dimensional maze consisting of  grids arranged in a row! The grids are nu ...

  8. 2017 CCPC秦皇岛 E题 String of CCPC

    BaoBao has just found a string  of length  consisting of 'C' and 'P' in his pocket. As a big fan of ...

  9. 2017 CCPC 哈尔滨站 HDU 6242

    Geometry Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Other ...

随机推荐

  1. 流式断言器AssertJ介绍

    本文来自网易云社区 作者:范旭斐 大家在使用testng.junit做自动化测试的过程中,经常会用到testng.junit自带的断言器,有时候对一个字符串.日期.列表进行断言很麻烦,需要借助到jdk ...

  2. 小球下落 (Dropping Balls,UVA 679)

    题目描述: 题目思路: 1.直接用数组模拟二叉树下落过程 //超时 #include <iostream> #include <cstring> using namespace ...

  3. 系统滴答定时器(SysTick)中断配置

    系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...

  4. 1.Hadoop介绍

    1. Hadoop介绍 1.1 什么是Hadoop 开源的,可靠的,分布式的,可伸缩的 提供的功能: 利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 1.2 处理方式 大众角度 数 ...

  5. CentOS6 安装VNCserver

    1.下载vncserver yum install tigervnc tigervnc-server -y 2.配置 vncserver vi /etc/sysconfig/vncserver 在文件 ...

  6. js单行写一个评级组件

    单行写一个评级组件:"★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate); -----------------------------------分隔符- ...

  7. lintcode-36-翻转链表 II

    36-翻转链表 II 翻转链表中第m个节点到第n个节点的部分 注意事项 m,n满足1 ≤ m ≤ n ≤ 链表长度 样例 给出链表1->2->3->4->5->null, ...

  8. s3c2440调试nandflash裸机程序遇到的问题

    图挂了可以去 https://github.com/tanghammer/mini2440_peripherals/blob/master/nand/debug_nand.md 按照前面sdram的代 ...

  9. 在Centos中,大容量,且读写频繁的目录

    1./根目录 2./usr目录 3./home目录 4./var目录 5./Swap目录     比较特殊,只要物理内存没使用完,就不会被启用 以上为鸟哥的linuxPDF中的学习心得

  10. VS升级后的配置问题

    当vs升级到更新的版本后,运行原来无误的程序会出现一系列问题. 例如:打不开iostream文件,lib文件,系统找不到文件等等 出现这类问题的原因是,编译环境的include path和librar ...