传送门:3-Palindromes

题意:求为回文串且能整除3且不前导0的子串个数。

分析:由 manacher算法O(N)可算出以i为坐标的最长为p[i]回文子串,且Si-k,Si-k+1......Si+k-1,Si+k(0<k<p[i])全为回文串。

又知,能整除3的整数数位和也能整除3,那么只要Si-k,Si-k+1......Si+k-1,Si+k和整除3即可。

由回文串对称性知Si-k==Si-k,那么只要Si-k..Si-1这段中模3余数与Si模3余数相同,Si-k...Si+k和必定整除3(设左右各位余数x+本身x=3x).

因此只要预处理出Si...Sj整段中模3余0,1,2的个数,就可O(N)得出全部符合条件的子串。

  1. #pragma comment(linker,"/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <cmath>
  6. #include <limits.h>
  7. #include <iostream>
  8. #include <algorithm>
  9. #include <queue>
  10. #include <cstdlib>
  11. #include <stack>
  12. #include <vector>
  13. #include <set>
  14. #include <map>
  15. #define LL long long
  16. #define mod 1000000007
  17. #define inf 0x3f3f3f3f
  18. #define eps 1e-6
  19. #define N 1000010
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define PII pair<int,int>
  23. using namespace std;
  24. inline LL read()
  25. {
  26. char ch=getchar();LL x=,f=;
  27. while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
  28. while(ch<=''&&ch>=''){x=x*+ch-'';ch=getchar();}
  29. return x*f;
  30. }
  31. int p[N<<],len,num,mx,id;
  32. char s[N],str[N<<];
  33. void build()
  34. {
  35. len=strlen(s);num=;
  36. str[num++]='@';str[num++]='#';
  37. for(int i=;i<len;i++)
  38. {
  39. str[num++]=s[i];
  40. str[num++]='#';
  41. }
  42. str[num]=;
  43. }
  44. void manacher()
  45. {
  46. mx=;
  47. memset(p,,sizeof(p));
  48. for(int i=;i<num;i++)
  49. {
  50. if(mx>i)p[i]=min(p[*id-i],mx-i);
  51. else p[i]=;
  52. while(str[i-p[i]]==str[i+p[i]])p[i]++;
  53. if(p[i]+i>mx)mx=p[i]+i,id=i;
  54. }
  55. }
  56. int a[N<<],sum[N<<][];
  57. void solve()
  58. {
  59. for(int i=;i<num;i++)
  60. {
  61. a[i]=a[i-];//前缀和
  62. if(str[i]!='#')a[i]=(a[i]+str[i]-'')%;
  63. for(int j=;j<;j++)sum[i][j]=sum[i-][j];
  64. if(str[i]!='#'&&str[i]!='')
  65. sum[i][a[i]]++;
  66. }
  67. LL ans=;
  68. for(int i=;i<num;i++)
  69. {
  70. int t=(str[i]-'')%;
  71. if(str[i]=='#')t=;
  72. if(str[i]!='#'&&t==)ans++;
  73. int k=(t+a[i])%;//由于sum[i+p[i]-1][k]~sum[i][k]都多了a[i],因此补回来防止误差
  74. ans+=sum[i+p[i]-][k]-sum[i][k];
  75. }
  76. printf("%lld\n",ans);
  77. }
  78. int main()
  79. {
  80. while(scanf("%s",s)>)
  81. {
  82. build();
  83. manacher();
  84. solve();
  85. }
  86. }

CC 3-Palindromes(manacher)的更多相关文章

  1. HDU 5340 Three Palindromes (Manacher)

    题意: 判断是否能将字符串S分成三段非空回文串. 思路: 先预处理出前缀回文串和后缀回文串的位置,将位置分别装入两个集合中,O(n). 针对每个前缀回文串的终点位置,挑出不相交的后缀回文串,对中间那段 ...

  2. 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文树)

    [SPOJ]NUMOFPAL - Number of Palindromes(Manacher,回文树) 题面 洛谷 求一个串中包含几个回文串 题解 Manacher傻逼题 只是用回文树写写而已.. ...

  3. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  4. O(n)回文子串(Manacher)算法

    O(n)回文子串(Manacher)算法 资料来源网络 参见:http://www.felix021.com/blog/read.php?2040 问题描述: 输入一个字符串,求出其中最大的回文子串. ...

  5. 【学习笔记】字符串—马拉车(Manacher)

    [学习笔记]字符串-马拉车(Manacher) 一:[前言] 马拉车用于求解连续回文子串问题,效率极高. 其核心思想与 \(kmp\) 类似:继承. --引自 \(yyx\) 学姐 二:[算法原理] ...

  6. hdu5340—Three Palindromes—(Manacher算法)——回文子串

    Three Palindromes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  7. HDU 3948 The Number of Palindromes(Manacher+后缀数组)

    题意 求一个字符串中本质不同的回文子串的个数. $ 1\leq |string| \leq 100000$ 思路 好像是回文自动机的裸题,但是可以用 \(\text{Manacher}\) (马拉车) ...

  8. codeforce No to Palindromes!(枚举)

    /* 题意:给定一个字符串中没有任何长度>1的回文子串!求按照字典序的该串的下一个字符串 也不包含长度>1的任何回文子串! 思路:从最低位进行枚举,保证第i位 不与 第 i-1位和第 i- ...

  9. HDU 4513 吉哥系列故事——完美队形II(Manacher)

    Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成 ...

  10. FLASH CC 2015 CANVAS (七)总结

    FLASH CC 2015 CANVAS (一至七)确切来说是自己在摸索学习过程中而写.所以定为“开荒教程”. 去年年底转战H5,半年中一直非常忙也不敢用CC来做项目,担心有BUG或者无法实现需求,所 ...

随机推荐

  1. UPC 2959: Caoshen like math 这就是个水题

    http://acm.upc.edu.cn/problem.php?id=2959 这就是个水题,之所以要写这个题是感觉很有纪念意义 用力看就是盲……23333333333333333 这个题就是最小 ...

  2. 读书与写论文的引导书——leo鉴书60

    我是专科直接考的研究生.在论文写作方面基本能够算是初级.MBA毕业那会儿要写论文,在网上找了不少这方面的书,<论文与治学>是当中之中的一个. 这本那时为应景儿卖的书,成了我之后学习与工作的 ...

  3. 杭电 1711 Number Sequence

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. EasyUI - Tabs

    代码: 判断是不是已经存在,如果存在,则直接选中,否则创建新的tab. $('#tabs').tabs({ fit: true, border: false }) $('#Tree').tree({ ...

  5. BootStrap - FileUpload美化样式

    效果: 代码: <div class="panel panel-default" style="border: 1px solid #ffd800;"&g ...

  6. Eclipse TestNg插件

    TestNg作为一个测试框架,也有eclipse的插件: 官网给的安装插件地址是 : For Eclipse 3.4 and above, enter http://beust.com/eclipse ...

  7. DataReader,DataTable利用泛型填充实体类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...

  8. HTTPClient和URLConnection核心区别分析

    首先:在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection.但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活. 在An ...

  9. Hadoop 的常用组件一览

    Hadoop 集群安装及原理:hdfs命令行操作:Java操作hdfs的常用API接口:动态添加删除数据节点. HBase 集群安装及原理:Hbase命令行操作:Java操作Hbase的常用API接口 ...

  10. Cocos2d-x3.3RC0的Android编译Activity启动流程分析

    本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2 ...