题意:求一个字符串的最长回文子串

n<=1000

思路:这是一道论文题

需要注意的细节:

1.奇偶分类

2.中间的分割符与最后的附加字母都是最小值,但两者不能相同,否则height可能会出现问题

答案即为min(height[rank[x]+1]...height[rank[y]])

  1. var f:array[..,..]of longint;
  2. x,y,sa,rank,height,a,wc,wd:array[..]of longint;
  3. ch:ansistring;
  4. n,m,i,k,max,tmp,t,j:longint;
  5.  
  6. function min(x,y:longint):longint;
  7. begin
  8. if x<y then exit(x);
  9. exit(y);
  10. end;
  11.  
  12. procedure swap(var x,y:longint);
  13. var t:longint;
  14. begin
  15. t:=x; x:=y; y:=t;
  16. end;
  17.  
  18. function cmp(a,b,l:longint):boolean;
  19. begin
  20. exit((y[a]=y[b])and(y[a+l]=y[b+l]));
  21. end;
  22.  
  23. procedure getsa(n:longint);
  24. var i,j,p:longint;
  25. begin
  26. for i:= to n- do
  27. begin
  28. x[i]:=a[i];
  29. inc(wc[a[i]]);
  30. end;
  31. for i:= to m- do wc[i]:=wc[i-]+wc[i];
  32. for i:=n- downto do
  33. begin
  34. dec(wc[x[i]]);
  35. sa[wc[x[i]]]:=i;
  36. end;
  37. j:=; p:=;
  38. while p<n do
  39. begin
  40. p:=;
  41. for i:=n-j to n- do
  42. begin
  43. y[p]:=i; inc(p);
  44. end;
  45. for i:= to n- do
  46. if sa[i]>=j then begin y[p]:=sa[i]-j; inc(p); end;
  47. for i:= to n- do wd[i]:=x[y[i]];
  48. for i:= to m- do wc[i]:=;
  49. for i:= to n- do inc(wc[wd[i]]);
  50. for i:= to m- do wc[i]:=wc[i-]+wc[i];
  51. for i:=n- downto do
  52. begin
  53. dec(wc[wd[i]]);
  54. sa[wc[wd[i]]]:=y[i];
  55. end;
  56. for i:= to n do swap(x[i],y[i]);
  57. p:=; x[sa[]]:=;
  58. for i:= to n- do
  59. if cmp(sa[i-],sa[i],j) then x[sa[i]]:=p-
  60. else begin x[sa[i]]:=p; inc(p); end;
  61. j:=j*;
  62. m:=p;
  63. end;
  64. end;
  65.  
  66. procedure getheight(n:longint);
  67. var i,j,k:longint;
  68. begin
  69. k:=;
  70. for i:= to n do rank[sa[i]]:=i;
  71. for i:= to n- do
  72. begin
  73. if k> then dec(k);
  74. j:=sa[rank[i]-];
  75. while a[i+k]=a[j+k] do inc(k);
  76. height[rank[i]]:=k;
  77. end;
  78. end;
  79.  
  80. function query(x,y:longint):longint;
  81. var len,l:longint;
  82. begin
  83. len:=y-x+; l:=trunc(ln(len)/ln());
  84. exit(min(f[x,l],f[y-(<<l)+,l]));
  85. end;
  86.  
  87. function lcp(x,y:longint):longint;
  88. var i,j:longint;
  89. begin
  90. //inc(x); inc(y);
  91. i:=rank[x]; j:=rank[y];
  92. if i>j then swap(i,j);
  93. inc(i);
  94. exit(query(i,j));
  95. end;
  96.  
  97. procedure init;
  98. begin
  99. fillchar(a,sizeof(a),);
  100. fillchar(height,sizeof(height),);
  101. fillchar(sa,sizeof(sa),);
  102. fillchar(rank,sizeof(rank),);
  103. fillchar(f,sizeof(f),);
  104. fillchar(x,sizeof(x),);
  105. fillchar(y,sizeof(y),);
  106. fillchar(wc,sizeof(wc),);
  107. fillchar(wd,sizeof(wd),);
  108. end;
  109.  
  110. begin
  111. assign(input,'ural1297.in'); reset(input);
  112. assign(output,'ural1297.out'); rewrite(output);
  113. while not eof do
  114. begin
  115. init;
  116. readln(ch);
  117. n:=length(ch);
  118. if n= then break;
  119. for i:= to n- do a[i]:=ord(ch[i+]);
  120. a[n]:=; m:=;
  121. for i:=n+ to *n do a[i]:=ord(ch[n-(i-n)+]);
  122. a[n*+]:=;
  123. getsa(n*+);
  124. getheight(n*+);
  125. m:=n*+;
  126. t:=trunc(ln(m)/ln());
  127. for i:= to m do f[i,]:=height[i];
  128. for i:= to t do
  129. for j:= to m do
  130. if j+(<<(i-))<=m then f[j,i]:=min(f[j,i-],f[j+(<<(i-)),i-]);
  131. max:=; k:=;
  132. for i:= to n- do
  133. begin
  134. tmp:=lcp(i,*n-i)*-;
  135. if tmp>max then
  136. begin
  137. max:=tmp;
  138. k:=i;
  139. end;
  140. if i> then
  141. begin
  142. tmp:=lcp(i,n*-i+)*;
  143. if tmp>max then
  144. begin
  145. max:=tmp;
  146. k:=i;
  147. end;
  148. end;
  149. end;
  150. if max mod = then
  151. for j:=k-max div + to k+max div + do write(ch[j])
  152. else
  153. for j:=k-max div + to k+max div do write(ch[j]);
  154. writeln;
  155. // for i:= to n*+ do writeln(height[i]);
  156. // for i:= to n*+ do writeln(rank[i]);
  157. // writeln;
  158. end;
  159.  
  160. close(input);
  161. close(output);
  162. end.

【Ural1297】Palindrome(后缀数组)的更多相关文章

  1. UVA - 11475 Extend to Palindrome (后缀数组)

    Your task is, given an integer N, to make a palidrome (word that reads the same when you reverse it) ...

  2. 1297. Palindrome ural1297(后缀数组)

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

  3. URAL 1297 Palindrome 后缀数组

    D - Palindrome Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  4. URAL - 1297 Palindrome —— 后缀数组 最长回文子串

    题目链接:https://vjudge.net/problem/URAL-1297 1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB ...

  5. URAL 1297 Palindrome (后缀数组+RMQ)

    题意:给定一个字符串,求一个最长的回回文子串,多解输出第一个. 析:把字符串翻转然后放到后面去,中间用另一个字符隔开,然后枚举每一个回文串的的位置,对第 i 个位置,那么对应着第二个串的最长公共前缀, ...

  6. Ural1297 Palindrome(后缀数组)

        [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12406 [题意] 求最长回文子串. [思路] 将字符串 ...

  7. Ural 1297 Palindrome(Manacher或者后缀数组+RMQ-ST)

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

  8. URAL 1297 Palindrome(后缀数组+ST表)

    [题目链接] http://acm.timus.ru/problem.aspx?num=1297 [题目大意] 求最长回文子串,并输出这个串. [题解] 我们将原串倒置得到一个新的串,加一个拼接符将新 ...

  9. UVA 11475 Extend to Palindrome(后缀数组+ST表)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/27647 [题目大意] 给出一个字符串,要求在其后面添加最少的字符数,使得其成为一个回文串.并输出这个回文串 ...

  10. UVA - 11475 Extend to Palindrome —— 字符串哈希 or KMP or 后缀数组

    题目链接:https://vjudge.net/problem/UVA-11475 题意: 给出一个字符串,问在该字符串后面至少添加几个字符,使得其成为回文串,并输出该回文串. 题解: 实际上是求该字 ...

随机推荐

  1. Git之提交项目到远程github

    1.在分支dev下,默认本地工作区有项目project 2. git add project  [添加项目到暂存区] 3. git commit project -m "提交项目" ...

  2. JSP报错The value for the useBean class attribute *** is invalid.

    环境:IDEA+Tomcat9+JDK1.8 在前期学习时,环境一直能够"正常"使用,实际上环境并没有完全搭建成功. 推荐: https://blog.csdn.net/lw_po ...

  3. chrome调试之Workspaces

    可通过workspaces来编辑本地文件 workspaces是Chrome DevTools的一个强大功能,这使DevTools变成了一个真正的IDE.Workspaces会将Sources选项卡中 ...

  4. 微信小程序开发系列教程三:微信小程序的调试方法

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...

  5. SEO 第二章

    SEO第二章 1.  掌握搜索引擎工作原理(重点) 2.  了解百度算法 3.  关键词的分类 一.什么是搜索引擎? 搜索引擎是用来实现搜索服务的,说白了搜索引擎也属于一种网站. 浏览器是用来加载网站 ...

  6. Modal 下面的 v-model 就是显示不显示 true 或 false

    Modal 下面的 v-model 就是显示不显示 true 或 false

  7. django URL,views,html请求顺序

    进来的请求转入/hello/.   Django通过在ROOT_URLCONF配置来决定根URLconf.     Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目 ...

  8. 两个div之间的蜜汁间隙

    两个div左右相邻,想让他们紧挨在一起 加了margin:0:padding:0: 不知道为什么还是会有间隙. 然后在两个div的父元素加了:font-size:0: 就终于挨在一起惹.

  9. Spring-02 Java配置实现IOC

    Java配置 Spring4推荐使用java配置实现IOC Spring boot也推荐采用java配置实现IOC 在实际项目中,一般采用注解配置业务bean,全局配置使用Java配置. Java配置 ...

  10. Linux常用命令大全3

    linux命令1,关机shutdown -h now2,init 0 关闭系统3,shutdown -h hours:minutes &按预定时间关闭系统4,shutdown -c取消按预定时 ...