题意:找一个串中的最长连续两个回文子串长度

题解:建两个回文树,一个正着,一个反着,每次add之后last的长度就是后缀最长的回文串长度,然后两边加一遍即可

  1. /**************************************************************
  2. Problem: 2565
  3. User: walfy
  4. Language: C++
  5. Result: Accepted
  6. Time:164 ms
  7. Memory:49928 kb
  8. ****************************************************************/
  9. //#pragma GCC optimize(2)
  10. //#pragma GCC optimize(3)
  11. //#pragma GCC optimize(4)
  12. //#pragma GCC optimize("unroll-loops")
  13. //#pragma comment(linker, "/stack:200000000")
  14. //#pragma GCC optimize("Ofast,no-stack-protector")
  15. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  16. #include<bits/stdc++.h>
  17. #define fi first
  18. #define se second
  19. #define db double
  20. #define mp make_pair
  21. #define pb push_back
  22. #define pi acos(-1.0)
  23. #define ll long long
  24. #define vi vector<int>
  25. #define mod 998244353
  26. #define ld long double
  27. #define C 0.5772156649
  28. #define ls l,m,rt<<1
  29. #define rs m+1,r,rt<<1|1
  30. #define pll pair<ll,ll>
  31. #define pil pair<int,ll>
  32. #define pli pair<ll,int>
  33. #define pii pair<int,int>
  34. //#define cd complex<double>
  35. #define ull unsigned long long
  36. #define base 1000000000000000000
  37. #define Max(a,b) ((a)>(b)?(a):(b))
  38. #define Min(a,b) ((a)<(b)?(a):(b))
  39. #define fin freopen("a.txt","r",stdin)
  40. #define fout freopen("a.txt","w",stdout)
  41. #define fio ios::sync_with_stdio(false);cin.tie(0)
  42. template<typename T>
  43. inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
  44. template<typename T>
  45. inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
  46. inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
  47. inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
  48. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  49. inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
  50. inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}
  51. using namespace std;
  52. const double eps=1e-8;
  53. const ll INF=0x3f3f3f3f3f3f3f3f;
  54. const int N=200000+10,maxn=400000+10,inf=0x3f3f3f3f;
  55. struct PAM{
  56. int ch[N][26],fail[N],cnt[N],len[N],s[N],ans[N];
  57. int last,n,p;
  58. int newnode(int w)
  59. {
  60. for(int i=0;i<26;i++)ch[p][i] = 0;
  61. cnt[p] = 0;
  62. len[p] = w;
  63. return p++;
  64. }
  65. void init()
  66. {
  67. p = last = n = 0;
  68. newnode(0);
  69. newnode(-1);
  70. s[n] = -1;
  71. fail[0] = 1;
  72. }
  73. int getfail(int x)
  74. {
  75. while(s[n-len[x]-1] != s[n]) x = fail[x];
  76. return x;
  77. }
  78. void add(int c)
  79. {
  80. s[++n] = c;
  81. int cur = getfail(last);
  82. if(!ch[cur][c]){
  83. int now = newnode(len[cur]+2);
  84. fail[now] = ch[getfail(fail[cur])][c];
  85. ch[cur][c] = now;
  86. }
  87. last = ch[cur][c];
  88. ans[n]=len[last];
  89. cnt[last]++;
  90. }
  91. }pam1,pam2;
  92. char s[N];
  93. int main()
  94. {
  95. pam1.init(),pam2.init();
  96. scanf("%s",s+1);
  97. int len=strlen(s+1);
  98. for(int i=1;i<=len;i++)pam1.add(s[i]-'a');
  99. reverse(s+1,s+len+1);
  100. for(int i=1;i<=len;i++)pam2.add(s[i]-'a');
  101. int res=0;
  102. for(int i=1;i<len;i++)
  103. res=max(res,pam1.ans[i]+pam2.ans[len-i]);
  104. printf("%d\n",res);
  105. return 0;
  106. }
  107. /********************
  108. ********************/

bzoj2565: 最长双回文串 pam的更多相关文章

  1. BZOJ2565 最长双回文串 【Manacher】

    BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...

  2. BZOJ2565最长双回文串——manacher

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...

  3. BZOJ2565:最长双回文串(Manacher)

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ...

  4. p4555&bzoj2565 最长双回文串

    传送门(洛谷) 传送门(bzoj) 题目 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 nnn 的串 SSS ...

  5. BZOJ2565: 最长双回文串(Manacher)

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...

  6. bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...

  7. 2019.03.02 bzoj2565: 最长双回文串(pam)

    传送门 题意简述:问最长的由两个回文串连接而成最长字串长度. 思路: 正反串各建一个pampampam然后就完了. 代码: #include<bits/stdc++.h> #define ...

  8. BZOJ2565: 最长双回文串(回文树)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 记录一下每个点往前最长延伸位置,正反两遍,枚举分割点. #include<cstr ...

  9. bzoj2565: 最长双回文串

    manacher之后乱搞 #include <iostream> #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. 今天的任务--git练习

    克隆远程仓库项目 从版本控制中选择git 填写地址和本地目录,test测试成功后点击clone 克隆完成回到主界面,点击open打开刚才克隆的项目 git操作 添加文件py1.html 打开命令行 新 ...

  2. Hadoop【单机安装-测试程序WordCount】

    Hadoop程序说明,就是创建一个文本文件,然后统计这个文本文件中单词出现过多少次! (MapReduce 运行在本地   启动JVM ) 第一步    创建需要的文件目录,然后进入该文件中进行编辑 ...

  3. Levenshtein Distance,判断字符串的相似性

    private int LevenshteinDistance(string s1,string s2,int maxValue) { if (s1 == null|| s1.Length == 0) ...

  4. POJ 1733 Parity game(种类并查集)

    http://poj.org/problem?id=1733 题意: 给出一个01串,有多次询问,每次回答[l,r]这个区间内1的个数的奇偶性,但是其中有一些回答是错误的,问到第几个回答时与前面的回答 ...

  5. python学习 day10打卡 函数的进阶

    本节主要内容: 1.函数参数--动态参数 2.名称空间,局部名称空间,全局名称空间,作用域,加载顺序. 3.函数的嵌套 4.gloabal,nonlocal关键字 一.函数参数--动态传参 形参的第三 ...

  6. WinForm 中 comboBox控件数据绑定

    一.IList 现在我们直接创建一个List集合,然后绑定 IList<string> list = new List<string>(); list.Add("11 ...

  7. React native中的组建通知通信:

    有这么一个需求,在B页面pop()回到A页面,需要A页面执行刷新,那么我们可以采用以下方法: 1:在A页面Push到B页面中,加上一个A页面中的刷新函数做为参数,然后在B页面中在pop()函数封装后通 ...

  8. _ai_creature

  9. 使用外网访问阿里云服务器ZooKeeper

    参考网址: zookeeper单机/集群安装详解 使用外网访问阿里云服务器ZooKeeper 阿里云服务管理控制台 1. 阿里云ECS安装zookeeper 环境:我安装的是zookeeper3.4. ...

  10. Gradle实现编译差异

    今天开发组长问了这么一个问题,如何实现通过gradle编译动态设置代码里的一些值.可能这么说不太明白,下面说依稀具体需求. 开发中有两个服务器:一个用于测试版本.一个用于线上版本发布,这两个服务器地址 ...