【Ural1297】Palindrome(后缀数组)
题意:求一个字符串的最长回文子串
n<=1000
思路:这是一道论文题
需要注意的细节:
1.奇偶分类
2.中间的分割符与最后的附加字母都是最小值,但两者不能相同,否则height可能会出现问题
答案即为min(height[rank[x]+1]...height[rank[y]])
- var f:array[..,..]of longint;
- x,y,sa,rank,height,a,wc,wd:array[..]of longint;
- ch:ansistring;
- n,m,i,k,max,tmp,t,j:longint;
- function min(x,y:longint):longint;
- begin
- if x<y then exit(x);
- exit(y);
- end;
- procedure swap(var x,y:longint);
- var t:longint;
- begin
- t:=x; x:=y; y:=t;
- end;
- function cmp(a,b,l:longint):boolean;
- begin
- exit((y[a]=y[b])and(y[a+l]=y[b+l]));
- end;
- procedure getsa(n:longint);
- var i,j,p:longint;
- begin
- for i:= to n- do
- begin
- x[i]:=a[i];
- inc(wc[a[i]]);
- end;
- for i:= to m- do wc[i]:=wc[i-]+wc[i];
- for i:=n- downto do
- begin
- dec(wc[x[i]]);
- sa[wc[x[i]]]:=i;
- end;
- j:=; p:=;
- while p<n do
- begin
- p:=;
- for i:=n-j to n- do
- begin
- y[p]:=i; inc(p);
- end;
- for i:= to n- do
- if sa[i]>=j then begin y[p]:=sa[i]-j; inc(p); end;
- for i:= to n- do wd[i]:=x[y[i]];
- for i:= to m- do wc[i]:=;
- for i:= to n- do inc(wc[wd[i]]);
- for i:= to m- do wc[i]:=wc[i-]+wc[i];
- for i:=n- downto do
- begin
- dec(wc[wd[i]]);
- sa[wc[wd[i]]]:=y[i];
- end;
- for i:= to n do swap(x[i],y[i]);
- p:=; x[sa[]]:=;
- for i:= to n- do
- if cmp(sa[i-],sa[i],j) then x[sa[i]]:=p-
- else begin x[sa[i]]:=p; inc(p); end;
- j:=j*;
- m:=p;
- end;
- end;
- procedure getheight(n:longint);
- var i,j,k:longint;
- begin
- k:=;
- for i:= to n do rank[sa[i]]:=i;
- for i:= to n- do
- begin
- if k> then dec(k);
- j:=sa[rank[i]-];
- while a[i+k]=a[j+k] do inc(k);
- height[rank[i]]:=k;
- end;
- end;
- function query(x,y:longint):longint;
- var len,l:longint;
- begin
- len:=y-x+; l:=trunc(ln(len)/ln());
- exit(min(f[x,l],f[y-(<<l)+,l]));
- end;
- function lcp(x,y:longint):longint;
- var i,j:longint;
- begin
- //inc(x); inc(y);
- i:=rank[x]; j:=rank[y];
- if i>j then swap(i,j);
- inc(i);
- exit(query(i,j));
- end;
- procedure init;
- begin
- fillchar(a,sizeof(a),);
- fillchar(height,sizeof(height),);
- fillchar(sa,sizeof(sa),);
- fillchar(rank,sizeof(rank),);
- fillchar(f,sizeof(f),);
- fillchar(x,sizeof(x),);
- fillchar(y,sizeof(y),);
- fillchar(wc,sizeof(wc),);
- fillchar(wd,sizeof(wd),);
- end;
- begin
- assign(input,'ural1297.in'); reset(input);
- assign(output,'ural1297.out'); rewrite(output);
- while not eof do
- begin
- init;
- readln(ch);
- n:=length(ch);
- if n= then break;
- for i:= to n- do a[i]:=ord(ch[i+]);
- a[n]:=; m:=;
- for i:=n+ to *n do a[i]:=ord(ch[n-(i-n)+]);
- a[n*+]:=;
- getsa(n*+);
- getheight(n*+);
- m:=n*+;
- t:=trunc(ln(m)/ln());
- for i:= to m do f[i,]:=height[i];
- for i:= to t do
- for j:= to m do
- if j+(<<(i-))<=m then f[j,i]:=min(f[j,i-],f[j+(<<(i-)),i-]);
- max:=; k:=;
- for i:= to n- do
- begin
- tmp:=lcp(i,*n-i)*-;
- if tmp>max then
- begin
- max:=tmp;
- k:=i;
- end;
- if i> then
- begin
- tmp:=lcp(i,n*-i+)*;
- if tmp>max then
- begin
- max:=tmp;
- k:=i;
- end;
- end;
- end;
- if max mod = then
- for j:=k-max div + to k+max div + do write(ch[j])
- else
- for j:=k-max div + to k+max div do write(ch[j]);
- writeln;
- // for i:= to n*+ do writeln(height[i]);
- // for i:= to n*+ do writeln(rank[i]);
- // writeln;
- end;
- close(input);
- close(output);
- end.
【Ural1297】Palindrome(后缀数组)的更多相关文章
- 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) ...
- 1297. Palindrome ural1297(后缀数组)
1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...
- URAL 1297 Palindrome 后缀数组
D - Palindrome Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- URAL - 1297 Palindrome —— 后缀数组 最长回文子串
题目链接:https://vjudge.net/problem/URAL-1297 1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB ...
- URAL 1297 Palindrome (后缀数组+RMQ)
题意:给定一个字符串,求一个最长的回回文子串,多解输出第一个. 析:把字符串翻转然后放到后面去,中间用另一个字符隔开,然后枚举每一个回文串的的位置,对第 i 个位置,那么对应着第二个串的最长公共前缀, ...
- Ural1297 Palindrome(后缀数组)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12406 [题意] 求最长回文子串. [思路] 将字符串 ...
- 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 ...
- URAL 1297 Palindrome(后缀数组+ST表)
[题目链接] http://acm.timus.ru/problem.aspx?num=1297 [题目大意] 求最长回文子串,并输出这个串. [题解] 我们将原串倒置得到一个新的串,加一个拼接符将新 ...
- UVA 11475 Extend to Palindrome(后缀数组+ST表)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/27647 [题目大意] 给出一个字符串,要求在其后面添加最少的字符数,使得其成为一个回文串.并输出这个回文串 ...
- UVA - 11475 Extend to Palindrome —— 字符串哈希 or KMP or 后缀数组
题目链接:https://vjudge.net/problem/UVA-11475 题意: 给出一个字符串,问在该字符串后面至少添加几个字符,使得其成为回文串,并输出该回文串. 题解: 实际上是求该字 ...
随机推荐
- Git之提交项目到远程github
1.在分支dev下,默认本地工作区有项目project 2. git add project [添加项目到暂存区] 3. git commit project -m "提交项目" ...
- JSP报错The value for the useBean class attribute *** is invalid.
环境:IDEA+Tomcat9+JDK1.8 在前期学习时,环境一直能够"正常"使用,实际上环境并没有完全搭建成功. 推荐: https://blog.csdn.net/lw_po ...
- chrome调试之Workspaces
可通过workspaces来编辑本地文件 workspaces是Chrome DevTools的一个强大功能,这使DevTools变成了一个真正的IDE.Workspaces会将Sources选项卡中 ...
- 微信小程序开发系列教程三:微信小程序的调试方法
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...
- SEO 第二章
SEO第二章 1. 掌握搜索引擎工作原理(重点) 2. 了解百度算法 3. 关键词的分类 一.什么是搜索引擎? 搜索引擎是用来实现搜索服务的,说白了搜索引擎也属于一种网站. 浏览器是用来加载网站 ...
- Modal 下面的 v-model 就是显示不显示 true 或 false
Modal 下面的 v-model 就是显示不显示 true 或 false
- django URL,views,html请求顺序
进来的请求转入/hello/. Django通过在ROOT_URLCONF配置来决定根URLconf. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目 ...
- 两个div之间的蜜汁间隙
两个div左右相邻,想让他们紧挨在一起 加了margin:0:padding:0: 不知道为什么还是会有间隙. 然后在两个div的父元素加了:font-size:0: 就终于挨在一起惹.
- Spring-02 Java配置实现IOC
Java配置 Spring4推荐使用java配置实现IOC Spring boot也推荐采用java配置实现IOC 在实际项目中,一般采用注解配置业务bean,全局配置使用Java配置. Java配置 ...
- Linux常用命令大全3
linux命令1,关机shutdown -h now2,init 0 关闭系统3,shutdown -h hours:minutes &按预定时间关闭系统4,shutdown -c取消按预定时 ...