LINK:如果我让你查回文你还爱我吗

了解到了这个模板题. 果然我不会写2333...

考试的时候想到了一个非常辣鸡的 线段树合并+莫队的做法 过不了不再赘述.

当然也想到了manacher不过不太会用 所以就自闭了。

这道题 容易考虑到manacher而不是PAM.

考虑 在扩充后的字符串上做这个问题 这样就不需要考虑偶数回文串的条件了.

离线之后右端点不断移动 容易发现一个问题 某个点为中心的回文串个数标记在左端点上不过此时可能左端点够而右端点不太行。

一个trick 将区间分成两半 这样就没有这个影响了.

然后查询直接查就行了 可以线段树维护区间加当然也可以树状数组维护.

值得一提的是 可以发现每次赋值 某一段整体赋值很好做 在奇数回文串的时候这样做容易发现是两倍。

偶数则不然 这里减掉区间中所有的单独的#就可以发现 答案刚好是二倍了.

  1. const int MAXN=200010<<1;
  2. int n,Q;
  3. struct jl{int l,r;int id;}sl[MAXN],sr[MAXN];
  4. inline int cmpl(jl a,jl b){return a.r<b.r;}
  5. inline int cmpr(jl a,jl b){return a.l>b.l;}
  6. struct wy
  7. {
  8. int l,r;
  9. ll sum,tag;
  10. }t[MAXN<<2];
  11. char a[MAXN],b[MAXN];
  12. int p[MAXN];ll ans[MAXN];
  13. inline void Manacher()
  14. {
  15. b[0]='#';b[1]='$';
  16. rep(1,n,i)b[i<<1]=a[i],b[i<<1|1]='$';
  17. n=n<<1|1;b[n+1]='0';
  18. int mx=0,mid=0;
  19. rep(1,n,i)
  20. {
  21. if(mx>i)p[i]=min(p[(mid<<1)-i],mx-i);
  22. else p[i]=1;
  23. while(b[i-p[i]]==b[i+p[i]])++p[i];
  24. if(p[i]+i>mx)mx=p[i]+i,mid=i;
  25. }
  26. }
  27. inline void pushdown(int p)
  28. {
  29. int mid=(l(p)+r(p))>>1;
  30. sum(zz)+=(ll)tag(p)*(mid-l(p)+1);
  31. sum(yy)+=(ll)tag(p)*(r(p)-mid);
  32. tag(zz)+=tag(p);tag(yy)+=tag(p);
  33. tag(p)=0;return;
  34. }
  35. inline void change(int p,int l,int r,int x)
  36. {
  37. if(l<=l(p)&&r>=r(p))
  38. {
  39. sum(p)+=(ll)(r(p)-l(p)+1)*x;
  40. tag(p)+=x;return;
  41. }
  42. int mid=(l(p)+r(p))>>1;
  43. if(tag(p))pushdown(p);
  44. if(l<=mid)change(zz,l,r,x);
  45. if(r>mid)change(yy,l,r,x);
  46. sum(p)=sum(zz)+sum(yy);
  47. }
  48. inline ll ask(int p,int l,int r)
  49. {
  50. if(l<=l(p)&&r>=r(p))return sum(p);
  51. int mid=(l(p)+r(p))>>1;ll cnt=0;
  52. if(tag(p))pushdown(p);
  53. if(l<=mid)cnt+=ask(zz,l,r);
  54. if(r>mid)cnt+=ask(yy,l,r);
  55. return cnt;
  56. }
  57. inline void build(int p,int l,int r)
  58. {
  59. l(p)=l;r(p)=r;
  60. sum(p)=tag(p)=0;
  61. if(l==r)return;
  62. int mid=(l+r)>>1;
  63. build(zz,l,mid);
  64. build(yy,mid+1,r);
  65. }
  66. inline void solve_l()
  67. {
  68. build(1,1,n);int flag=1;
  69. sort(sl+1,sl+1+Q,cmpl);
  70. rep(1,n,i)
  71. {
  72. change(1,i-p[i]+1,i,1);
  73. while(sl[flag].r<=i&&flag<=Q)
  74. {
  75. ans[sl[flag].id]+=ask(1,sl[flag].l,sl[flag].r);
  76. ++flag;
  77. }
  78. }
  79. }
  80. inline void solve_r()
  81. {
  82. build(1,1,n);int flag=1;
  83. sort(sr+1,sr+1+Q,cmpr);
  84. fep(n,1,i)
  85. {
  86. change(1,i,i+p[i]-1,1);
  87. while(sr[flag].l>=i&&flag<=Q)
  88. {
  89. ans[sr[flag].id]+=ask(1,sr[flag].l,sr[flag].r);
  90. ++flag;
  91. }
  92. }
  93. }
  94. int main()
  95. {
  96. //freopen("1.in","r",stdin);
  97. gt(n);gt(Q);gc(a);
  98. Manacher();
  99. rep(1,Q,i)
  100. {
  101. int get(l),get(r);
  102. ans[i]-=(r-l+2);
  103. l=l<<1;--l;r=r<<1;++r;
  104. int mid=(l+r)>>1;
  105. sl[i]=(jl){l,mid,i};
  106. sr[i]=(jl){mid+1,r,i};
  107. }
  108. solve_l();solve_r();
  109. rep(1,Q,i)putl(ans[i]>>1);
  110. return 0;
  111. }

牛客练习赛64 如果我让你查回文你还爱我吗 线段树 树状数组 manacher 计数 区间本质不同回文串个数的更多相关文章

  1. 牛客练习赛64 D【容斥+背包】

    牛客练习赛64 D.宝石装箱 Description \(n\)颗宝石装进\(n\)个箱子使得每个箱子中都有一颗宝石.第\(i\)颗宝石不能装入第\(a_i\)个箱子.求合法的装箱方案对\(99824 ...

  2. 牛客练习赛64 红色的樱花 exgcd 贪心

    LINK:The red sakura 暴怒狂樱 血染京都. 这题质量不咋地 这题也没啥营养. 不过还是存在值得学习的地方的. 一个trick n行 m列 第一行与第n行相连 第1列和第m列相连的时候 ...

  3. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  4. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  5. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  6. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  7. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  8. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  9. [堆+贪心]牛客练习赛40-B

    传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不 ...

随机推荐

  1. H5禁止微信内置浏览器调整字体大小

    微信webview内置了调整字体大小的功能,用户可以根据实际情况进行调节.但是这也会导致字体大小改变以后,出现页面布局错乱的情况. 1.iOS的解决方案是覆盖掉微信的样式: body { /* IOS ...

  2. 常用API - Scanner、Random、ArrayList

    API 概述 API(Application Programming Interface),应用程序编程接口. Java API是一本程序员的 字典 ,是JDK中提供给我们使用的类的说明文档. 这些类 ...

  3. MVC中model、dao、view、controlller、service之间的关系

    Model:是事物的模型,如Person.java,定义人的属性行为.pojo,OR maping,持久层 Dao:是持久化操作代码编写处,与数据库对接,如对Person进行增删改查. Service ...

  4. vue+elementUI 图片上传问题

    图片上传问题,获取后台的图片,并点击可以更换图片,并把图片存储到数据库中: (1)在编辑页面上,action指的图片上传的地址,header指请求头: (2)因为element-ui有自己上传的接口, ...

  5. 数据可视化之powerBI技巧(三)这个Power BI技巧很可爱:利用DAX制作时钟

    周末放松一下,给大家分享一个小技巧,仅利用DAX制作一个简易的时钟. 时钟效果如下: 这个时钟的制作只需一个度量值,你信吗? 事实上确实如此,制作步骤介绍如下: 1,新建参数,生成一个数字序列作为小时 ...

  6. linux专题(二):走近Linux系统 (2020-04-08 10:08)

    http://dwz.date/UDf 走近Linux系统 开机登录 开机会启动许多程序.它们在Windows叫做"服务"(service),在Linux就叫做"守护进程 ...

  7. 数据可视化实例(十): 相关图(matplotlib,pandas)

    相关图 https://datawhalechina.github.io/pms50/#/chapter8/chapter8 导入所需要的库 import numpy as np # 导入numpy库 ...

  8. one-hot 编码

    def onehot(labels): '''one-hot 编码''' #数据有几行输出 n_sample = len(labels) #数据分为几类.因为编码从0开始所以要加1 n_class = ...

  9. python爬虫学习01--电子书爬取

    python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...

  10. 并发编程之synchronized(二)------jvm对synchronized的优化

    一.锁的粗化 看如下代码 public class Test { StringBuffer stb = new StringBuffer(); public void test1(){ //jvm的优 ...