求出后缀数组和height数组,然后将这个串反过来写在前面然后枚举中心点并求两边的最长公共前缀即可(一定要加连接符)。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 200005
 4 int n,m,ans,a[N],b[N],h[N],sum[N],ra[N<<1],sa[N];
 5 char s[N],s1[N];
 6 void change(){
 7     for(int i=0;i<n;i++)a[i]=s[i];
 8     memcpy(ra,a,sizeof(a));
 9     sort(a,a+n);
10     m=unique(a,a+n)-a;
11     for(int i=0;i<n;i++)ra[i]=lower_bound(a,a+m,ra[i])-a+1;
12 }
13 void sort(int k){
14     memset(sum,0,sizeof(sum));
15     for(int i=0;i<n;i++)sum[ra[i+k]+1]++;
16     for(int i=1;i<=m;i++)sum[i+1]+=sum[i];
17     for(int i=0;i<n;i++)b[sum[ra[a[i]+k]]++]=a[i];
18 }
19 void build(){
20     for(int i=1;;i<<=1){
21         for(int j=0;j<n;j++)a[j]=j;
22         sort(i);
23         memcpy(a,b,sizeof(a));
24         sort(0);
25         m=a[b[0]]=1;
26         for(int j=1;j<n;a[b[j++]]=m)
27             if ((ra[b[j-1]]!=ra[b[j]])||(ra[b[j-1]+i]!=ra[b[j]+i]))m++;
28         memcpy(ra,a,sizeof(a));
29         if (m==n)break;
30     }
31     for(int i=0;i<n;i++)sa[ra[i]]=i;
32 }
33 void height(){
34     m=0;
35     for(int i=0;i<n;h[ra[i++]]=m,m-=(m>0))
36         for(int j=sa[ra[i]-1];(i!=j)&&(s[i+m]==s[j+m]);m++);
37     h[1]=0;
38 }
39 int lcp(int x,int y){
40     int ans=0x3f3f3f3f;
41     if (ra[x]>ra[y])swap(x,y);
42     for(int i=ra[x]+1;i<=ra[y];i++)ans=min(ans,h[i]);
43     return ans;
44 }
45 void write(int x,int y){
46     for(int i=x;i<=y;i++)printf("%c",s[i]);
47 }
48 int main(){
49     scanf("%s",s);
50     n=strlen(s);
51     s[n]='0';
52     for(int i=1;i<=n;i++)s[i+n]=s[n-i];
53     n=n*2+1;
54     change();
55     build();
56     height();
57     for(int i=0;i<n/2;i++)
58         ans=max(ans,max(2*lcp(i,n-i-1)-1,2*lcp(i,n-i)));
59     for(int i=0;i<n/2;i++){
60         if (2*lcp(i,n-i-1)-1==ans){
61             write(i-ans/2,i+ans/2);
62             return 0;
63         }
64         if (2*lcp(i,n-i)==ans){
65             write(i-ans/2,i+ans/2-1);
66             return 0;
67         }
68     }
69 }

View Code

转载于:https://www.cnblogs.com/PYWBKTDA/p/11254726.html

[ural1297]Palindrome相关推荐

  1. URAL1297 Palindrome【manacher算法】

    1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just ...

  2. ural1297 . Palindrome

    1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just ...

  3. ural1297. Palindrome

    1297. Palindrome Description The "U.S. Robots" HQ has just received a rather alarming anon ...

  4. 后缀数组(未完待续)

    后缀数组 简介 后缀数组(Suffix Array, SA)是一种在字符串问题中很实用的工具,其主要作用是求多模板匹配和最长公共前缀(LCP).与 AC自动机 预先处理模板串不同,后缀数组在进行多模板 ...

  5. 【LeetCode】Palindrome Partitioning 解题报告

    [题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...

  6. 234. Palindrome Linked List - Easy

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  7. LeetCode 125 Valid Palindrome(有效回文)(*)

    版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/5062 ...

  8. Lintcode108 Palindrome Partitioning || solution 题解

    [题目描述] Given a strings, cutsinto some substrings such that every substring is a palindrome. Return t ...

  9. 数位DP 回文序列 POJ-3280 Cheapest Palindrome

    Cheapest Palindrome [ POJ - 3280 ] 题目大意: 给定字符串s,长度为m,由n个小写字母组成.在s的任意位置增删字母,把它变成回文串,增删特定字母的花费不同,求最小花费 ...

最新文章

  1. 康托展开(Cantor expansion)
  2. gantt markdown
  3. Delphi7 (第一天:类的编写)续
  4. DevOps运维开发一体化 - 公开课笔记
  5. 【转】2007高校BBS上20个睿智的冷笑话
  6. 《从零开始学Swift》学习笔记(Day 32)——计算属性
  7. Bash脚本15分钟进阶教程-转
  8. (转)后监管时代的资本市场,数字金融能否迎来大爆发?
  9. BindingResult总结以及注意事项
  10. 使用JPBC实现双线性对加密算法(BasicIdent体制的java实现)
  11. 利用python实现m4a格式到MP3的转换
  12. 数字生态大会上,云鼎实验室介绍了这些重要成果
  13. 【软考-中级】系统集成项目管理工程师-【2信息系统集成和服务管理】
  14. Git 术语及中英文对照
  15. JAVA文件搜索过程中如何得到各种文件内容(office文件,PDF,邮件,mht,思维导图等)
  16. 英文中的一些常见缩写
  17. 如何一键导出PPT中的所有图片
  18. java keytool用法_Java keytool的用法 | Soo Smart!
  19. java怎么读取二进制_Java如何实现读取二进制文件
  20. 离线安装—Tensorflow教程

热门文章

  1. mysql创建fulltext索引_mysql – 如何在多个列上创建FULLTEXT索引?
  2. stride padding_关于Padding实现的一些细节
  3. python super()方法的作用_详解python的super()的作用和原理
  4. 兆比特每秒和兆字节每秒_宽带中的“M(兆)”是什么意思?
  5. asp.net获取浏览器的唯一标识_vue单页面应用如何在微信浏览器里进行网页授权获取用户信息
  6. vue项目 构建 打包 发布 三部曲
  7. IDEA 修改 jdk 版本
  8. css 百分比 怎么固定正方形_49 张 GIF 图中学习 49 个 CSS 知识点
  9. cfb为什么不需要填充_高压输电线路中为什么只有相线不需要零线
  10. Spark Dataset 入门详解