题意翻译

给定一个长度为n的小写字母串。问你有多少对相交的回文子 串(包含也算相交) 。 输入格式

第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式

相交的回文子串个数%51123987

题解

首先,我们要知道一个串有多少个回文串。

1.manacher,

枚举回文中心可以计算出所有的回文串个数

(i+p[i]-1)-(i-p[i]+1)+1

然后我们怎么知道多少相交的回文串呢?
计数问题要转化成有分界点的问题,便于利用乘法加法原理等。——lyd

这个相交显然不好处理,也没有分界点。

所以采用容斥。

2.容斥,所有的回文串对数-不相交的对数

不相交的话,分界点一下就出来了。我们可以枚举分解点试试。

因为这样便于划分成区间处理。

而直接相交处理不容易。

3.枚举分界点统计

c[x][0]以x开始的回文串个数,c[x][1]以x为末尾的回文串个数

这两个可以区间加,差分处理。

具体来说,一个点为中心的所有回文串,会给(i-p[i]+1)~(i)位置开始的回文串多一个。c[x][1]同理。

这里的差分,不用树状数组....并不需要动态维护修改查询

直接数组差分即可。最后从左到右累加,一边统计c[x][0/1]

然后令,pre[x],为c[x][1]的前缀和

对于枚举的分界点i(2<=i<=n) ,ans-=pre[i-1]*c[i][0]

根据回文串开始和结束位置的唯一性,这样一定不重不漏。

相当于把每个字符串和前面不相交的字符串都统计了一遍。

代码:注意%=mod

  1. #include<bits/stdc++.h>
  2. #define ri register int
  3. #define il inline
  4. using namespace std;
  5. typedef long long ll;
  6. const int N=+;
  7. const int mod=;
  8. int n,m;
  9. int p[*N];
  10. char a[N],b[*N];
  11. il void manacher(){
  12. p[]=;
  13. int mx=,id=;
  14. for(ri i=;i<=m;i++){
  15. p[i]=min(p[*id-i],mx-i);
  16. if(p[i]<) p[i]=;
  17. int j=i-p[i],k=i+p[i];
  18. while(j>=&&k<=m&&b[j]==b[k]){
  19. p[i]++;
  20. j--;k++;
  21. }
  22. if(i+p[i]->mx){
  23. mx=i+p[i]-;
  24. id=i;
  25. }
  26. }
  27. }
  28. ll f[N],g[N];
  29. ll ans,tot,sum;
  30. ll c[N][],pre[N];
  31. il void add1(int x,ll c){
  32. f[x]+=c;
  33. }
  34. il void add2(int x,ll c){
  35. g[x]+=c;
  36. }
  37. signed main()
  38. {
  39. scanf("%d",&n);
  40. scanf("%s",a+);
  41. b[++m]='#';
  42. for(ri i=;i<=n;i++){
  43. b[++m]=a[i];
  44. b[++m]='#';
  45. }
  46. manacher();
  47. for(ri i=;i<=m;i++){
  48. if(i&) (tot+=p[i]/)%=mod;//%mod;//#
  49. else (tot+=p[i]/)%=mod;//%mod;//not
  50. }
  51. ans=(tot*(tot-)/)%mod;//%mod;
  52. for(ri i=;i<=n;i++){
  53. add1(i-p[i*]/+,(ll)),add1(i+,(ll)-);
  54. if(i!=n) add1(i-p[i*+]/+,(ll)),add1(i+,(ll)-);
  55.  
  56. }
  57.  
  58. for(ri i=;i<=n;i++){
  59. c[i][]=(c[i-][]+f[i])%mod;
  60. }
  61.  
  62. for(ri i=;i<=n;i++){
  63. add2(i,(ll)),add2(i+(p[i*]/),(ll)-);
  64. if(i!=n) add2(i+,(ll)),add2(i+p[i*+]/+,(ll)-);
  65. }pre[]=;
  66. for(ri i=;i<=n;i++){
  67. c[i][]=(c[i-][]+g[i])%mod;
  68. pre[i]=(pre[i-]+c[i][])%mod;
  69. if(i>=){
  70. ll now=(pre[i-]*c[i][])%mod;
  71. ans=(ans+mod-now)%mod;
  72. }
  73. }
  74. printf("%lld",ans);
  75. return ;
  76. }

总结:

突破口:容斥。划分分界点统计。

CF17E Palisection——优秀的综合计数题的更多相关文章

  1. CF17E Palisection(manacher/回文树)

    CF17E Palisection(manacher/回文树) Luogu 题解时间 直接正难则反改成求不相交的对数. manacher求出半径之后就可以差分搞出以某个位置为开头/结尾的回文串个数. ...

  2. ZOJ 3955 Saddle Point 校赛 一道计数题

    ZOJ3955 题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000 对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列 对于 ...

  3. UOJ#428. 【集训队作业2018】普通的计数题

    #428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...

  4. 一道综合渗透题引发的updatexml()注入思考

    MYSQL数据库updatexml报错注入UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式, ...

  5. D. Count the Arrays 计数题

    D. Count the Arrays 也是一个计数题. 题目大意: 要求构造一个满足题意的数列. \(n\) 代表数列的长度 数列元素的范围 \([1,m]\) 数列必须有且仅有一对相同的数 存在一 ...

  6. 【NOIP2017提高A组模拟9.7】JZOJ 计数题

    [NOIP2017提高A组模拟9.7]JZOJ 计数题 题目 Description Input Output Sample Input 5 2 2 3 4 5 Sample Output 8 6 D ...

  7. noip模拟44[我想我以后会碰见计数题就溜走的]

    noip模拟44 solutions 这一场抱零的也忒多了,我也只有45pts 据说好像是把几套题里面最难的收拾出来让我们考得 好惨烈啊,这次的考试我只有第一题骗了40pts,其他都抱零了 T1 Em ...

  8. FJOI2020 的两道组合计数题

    最近细品了 FJOI2020 的两道计数题,感觉抛开数据范围不清还卡常不谈里面的组合计数技巧还是挺不错的.由于这两道题都基于卡特兰数的拓展,所以我们把它们一并研究掉. 首先是 D1T3 ,先给出简要题 ...

  9. 「10.16晚」序列(....)·购物(性质)·计数题(DP)

    A. 序列 考场不认真读题会死..... 读清题就很简单了,分成若干块,然后块内递增,块外递减,同时使最大的块长为$A$ B. 购物 考场思路太局限了,没有发现性质, 考虑将$a_{i}$,排序前缀和 ...

随机推荐

  1. kubeadm源码修改证书时间 -1.13

    编译后~ 链接:https://pan.baidu.com/s/1ofLX1Sv0ZF2yjkJdqf-6rw 提取码:cnbd 已统一与CA证书都是10年 已测试 适用于k8s 1.10 至 1.1 ...

  2. netcore如何引用package?

    netcore项目引用dll包,分如下三种: 1.引用网络包 从nuget获取,然后引入,使用命令:dotnet add package 包名 然后:dotnet restore 2.引用同解决方案的 ...

  3. 编写和调试Android下JNI程序流程

    1,切换到Android目录下bin/classes,使用javah命令生成jni所需的头文件,命令类似于:javah com.xxx.ooo,其中,com.xxx为package名称,ooo为包含n ...

  4. Notes of Daily Scrum Meeting(11.17)

    Notes of Daily Scrum Meeting(11.17) 今天是第四周的周一,也就是说距离最后发布也只剩下一周的时间,但我们的工程里面还有很多的问题没有解决,我关注过 其他一两个小组,他 ...

  5. Scrum Meeting 7 -2014.11.13

    之前srcum没写好是我的错.以后会每天更新的. 老师反映之前项目小组从pdf中提取作者效果不好,我们讨论决定进行一定的优化.在整合测试的同时开始服务器程序部署. Member Today’s tas ...

  6. HDU 1015 Jury Compromise 01背包

    题目链接: http://poj.org/problem?id=1015 Jury Compromise Time Limit: 1000MSMemory Limit: 65536K 问题描述 In ...

  7. What is ASP.NET SignalR

    什么是ASP.NET SignalR ASP.NET SignalR是ASP.NET开发人员的新库,它使得为应用程序添加实时Web功能变得非常简单. 什么是“实时网络”功能?它能够让您的服务器端代码实 ...

  8. 学习Web Service、wcf、webapi的区别

    csdn:关于wcf,webservice,webapi或者其他服务或者接口有什么区别. wcf,webservice采用的是rpc协议,这个协议很复杂,所以每次要传递.要校验的内容也很复杂,别看我们 ...

  9. Week2-作业1

    第一章:引用:如果一架民用飞机上有一个功能,用户使用它的概率是百万分之一,你还要做这个功能么?      选择之后,这个功能是什么呢?谜底是飞机的安全功能.        个人认为,飞机的安全功能这个 ...

  10. redis简介及增删改查

    redis 是一个文档(nosql)数据库,工作与内存,主要用做高速缓存 缓存经常会查到的数据 存入的值默认是字符串 使用步骤: 1 从redis.io下载 2 点击redis-server.exe启 ...