【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 题意: 给出一个字符串,问在该字符串后面至少添加几个字符,使得其成为回文串,并输出该回文串. 题解: 实际上是求该字 ...
随机推荐
- 【转】javap -c命令详解
javap -c命令详解 一直在学习Java,碰到了很多问题,碰到了很多关于i++和++i的难题,以及最经典的String str = "abc" 共创建了几个对象的疑难杂症. 知 ...
- hihocoder1133 二分·二分查找之k小数
思路: 类似于快排的分治算法. 实现: #include <iostream> #include <cstdio> #include <algorithm> #in ...
- RecyclerView 缓存机制学习笔记1
盗用别人图片 获取VIew的方法的流程 最先调用 其次调用 这个方法调用会先去缓存 这个是是否有动画,有动画就去里面取. 如果取不到就接着调用 如果在没有继续调用 都取不到就去实例化 调用的次数取决于 ...
- Scala基础篇-05求值策略
Scala的求值策略有2种: call by value call by name 如何区分? 例子: def bar(x:Int,y: => Int) = def loop(): Int=lo ...
- ios水果风暴游戏源码项目下载
这是一款ios水果风暴游戏源码下载,介绍给大家一下,喜欢的朋友可以下载学习一下吧.应用介绍:这是一个以获得高分和挑战更高难度为目的的游戏.游戏中有九种不同的卡通水果,您可以交换屏幕中两个相邻水果的位置 ...
- 3.12 在运算和比较时使用NULL值
问题:NULL值永远不会等于或不等于任何值,也包括NULL值自己,但是需要像计算真实值一样计算可为空列的返回值.例如,需要在表emp中查出所有比“WARD”提成(COMM)低的员工,提成为NULL(空 ...
- Android(java)学习笔记175:Android进程间通讯(IPC)之AIDL
一.IPC inter process communication 进程间通讯 二.AIDL android interface defination language 安卓接口定义语言 满 ...
- 使用python编写的简单远程管理软件
因为用户可以选择是否同意被控制,所以并不算是木马. 使用python3.7,spyder,在windows 10 开发. client为控制端,server为被控端. 参考 mygithub http ...
- C++构造函数(复制构造函数)、析构函数
注:若类中没有显示的写如下函数,编译会自动生成:默认复制构造函数.默认赋值构造函数(浅拷贝).默认=运算符重载函数(浅拷贝).析构函数: 1.默认构造函数(默认值)构造函数的作用:初始化对象的数据成员 ...
- spring boot 自动生成mybatis代码
1)在pom.xml中增加generator插件 <!--自动生成mybaits--> <plugin> <groupId>org.mybatis.generato ...