1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #define N 20005
  5. using namespace std;
  6. int buf1[N],buf2[N],sa[N],rnk[N],buc[N],n,height[N],ans,Log[N],pos,Min[N][];
  7. char s[N];
  8. void suffix_sort()
  9. {
  10. int *x=buf1,*y=buf2,m=;
  11. for (int i=;i<m;i++) buc[i]=;
  12. for (int i=;i<=n;i++) buc[x[i]=s[i]]++;
  13. for (int i=;i<=m;i++) buc[i]+=buc[i-];
  14. for (int i=n;i;i--) sa[buc[x[i]]--]=i;
  15. for (int k=;k<=n;k<<=)
  16. {
  17. int p=;
  18. for (int i=n-k+;i<=n;i++)
  19. y[++p]=i;
  20. for (int i=;i<=n;i++)
  21. if (sa[i]>k) y[++p]=sa[i]-k;
  22. for (int i=;i<=m;i++) buc[i]=;
  23. for (int i=;i<=n;i++) buc[x[y[i]]]++;
  24. for (int i=;i<=m;i++) buc[i]+=buc[i-];
  25. for (int i=n;i;i--) sa[buc[x[y[i]]]--]=y[i];
  26. swap(x,y),x[sa[]]=p=;
  27. for (int i=;i<=n;i++)
  28. if (y[sa[i-]]==y[sa[i]] && y[sa[i-]+k]== y[sa[i]+k])
  29. x[sa[i]]=p;
  30. else x[sa[i]]=++p;
  31. if ((m=p)>=n) break;
  32. }
  33. for (int i=;i<=n;i++)
  34. rnk[sa[i]]=i;
  35. for (int i=,j,k=;i<=n;i++)
  36. {
  37. if (rnk[i]==) continue;
  38. if (k) k--;
  39. j=sa[rnk[i]-];
  40. while (s[i+k]==s[j+k] && i+k<=n && j+k<=n) k++;
  41. height[rnk[i]]=k;
  42. }
  43. }
  44. void InitRmq()
  45. {
  46. for (int i=;i<=n;i++) Min[i][]=height[i];
  47. for (int j=;j<=;j++)
  48. for (int i=;i+(<<j)-<=n;i++)
  49. Min[i][j]=min(Min[i][j-],Min[i+(<<j-)][j-]);
  50. }
  51. int Query(int x,int y)
  52. {
  53. int i=rnk[x],j=rnk[y];
  54. if (i>j) swap(i,j);
  55. int len=Log[j-i];
  56. return min(Min[i+][len],Min[j-(<<len)+][len]);
  57. }
  58. int main()
  59. {
  60. scanf("%s",s+);
  61. n=strlen(s+);
  62. if (n==)
  63. {
  64. puts(s+);
  65. return ;
  66. }
  67. s[n+]='#';
  68. for (int i=;i<=n;i++)
  69. s[*n+-i]=s[i];
  70. n=n*+;
  71. suffix_sort();
  72. for (int i=;i<=n;i++)
  73. Log[i]=Log[i>>]+;
  74. InitRmq();
  75. for (int i=;i<=(n-)/;i++)
  76. {
  77. int tmp=Query(i,n-i+);
  78. if (tmp*>ans) ans=tmp*,pos=i-tmp;
  79. tmp=Query(i,n-i+);
  80. if (tmp*->ans) ans=tmp*-,pos=i-tmp+;
  81. }
  82. for (int i=;i<=ans;i++)
  83. putchar(s[i+pos-]);
  84. return ;
  85. }

ural1297 求最长回文子串 | 后缀数组的更多相关文章

  1. URAL 1297 最长回文子串(后缀数组)

    1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...

  2. Ural1297 最长回文子串(后缀数组+RMQ)

    /* 源程序丢失QWQ. 就不粘代码了. 大体做法是把串反转然后连接. 做一遍后缀数组. 对height做一遍rmq. 然后对于每个位置的奇偶分别判断, 记下pos. 注意求的是[l+1,r]的hei ...

  3. hdu 3068 最长回文(manachar求最长回文子串)

    题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...

  4. PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  5. Manacher模板( 线性求最长回文子串 )

    模板 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> us ...

  6. 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297

    1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...

  7. 求最长回文子串 - leetcode 5. Longest Palindromic Substring

    写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...

  8. Manacher算法 O(n) 求最长回文子串

    转自:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧. ...

  9. Manacher算法——求最长回文子串

    首先,得先了解什么是回文串.回文串就是正反读起来就是一样的,如“abcdcba”.我们要是直接采用暴力方法来查找最长回文子串,时间复杂度为O(n^3),好一点的方法是枚举每一个字符,比较较它左右距离相 ...

随机推荐

  1. .NET MVC和.NET WEB api混用时注意事项

    1.同时配置了mvc路由和api路由时,mvc路由无法访问(调用所有mvc路由全部404错误) 在Global.asax中,需注意路由注册的顺序,将api路由注册放在最后: 即将 void Appli ...

  2. zookeeper应用:屏障、队列、分布式锁

    zookeeper工具类: 获取连接实例:创建节点:获取子节点:设置节点数据:获取节点数据:访问控制等. package org.windwant.zookeeper; import org.apac ...

  3. 关于html2canvas清晰度

    最近有个小项目 需要生成海报让用户去分享~~~vue做的,海报通过html2canvas 生成. 遇到的最大问题是生成图片的清晰度~~网上找了好多方法. 放大倍数!~网上找的~~ var cntEle ...

  4. openjudge-2的100次方阶乘

    开始进行的第一天 #include <stdio.h> #include <string.h> int main() { int n; scanf("%d" ...

  5. centos 6.5 启动时卡在进度条位置无法进入系统解决办法。

    今天公司服务器因突然断电导致phddns 花生壳 启动失败,一直卡在启动进度条页面. 解决办法 1.按F5查看卡在什么位置, 2.查看解决方法:程序卡住的情况下,直接备份资料后,卸载程序重启就可以了. ...

  6. leetcode7_C++整数反转

      给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 输出:  示例 2: 输入: - 输出: - 示例 3: 输入: 输出: 注意: 假设我们的环境只能存 ...

  7. SGU 194 Reactor Cooling(无源无汇上下界可行流)

    Description The terrorist group leaded by a well known international terrorist Ben Bladen is bulidin ...

  8. 互评Alpha版本——Thunder团队

    基于NABCD评论作品 Hello World! :http://www.cnblogs.com/120626fj/p/7807544.html 欢迎来怼 :http://www.cnblogs.co ...

  9. java—连连看GUI

    1.连连看棋盘图形化 package Link; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; impo ...

  10. 基于3D卷积神经网络的人体行为理解(论文笔记)(转)

    基于3D卷积神经网络的人体行为理解(论文笔记) zouxy09@qq.com http://blog.csdn.net/zouxy09 最近看Deep Learning的论文,看到这篇论文:3D Co ...