POJ 2217:Secretary(后缀数组)
题目大意:求两个字符串的公共子串。
分析:
模板题,将两个字符串接起来用不会出现的字符分割,然后求分属两个字符串的相邻后缀lcp的最大值即可。
代码:
program work;
type
arr=array[..]of longint;
var
sa,rank,b,tmp,lcp:arr;
n,i,m,l,u,ans,t:longint;
s,s1,s2:ansistring;
ch:char;
function compare(i,j,k:longint):longint;
var ri,rj:longint;
begin
if rank[i]<>rank[j] then exit(ord(rank[i]<rank[j]))
else
begin
if i+k<=n then ri:=rank[i+k] else ri:=-;
if j+k<=n then rj:=rank[j+k] else rj:=-;
exit(ord(ri<rj));
end;
end;
procedure qsort(l,h,k:longint; var a:arr);
var i,j,t,m:longint;
begin i:=l; j:=h;
m:=a[(i+j) div ];
repeat
while compare(a[i],m,k)= do inc(i);
while compare(m,a[j],k)= do dec(j);
if i<=j then
begin t:=a[i]; a[i]:=a[j]; a[j]:=t;
inc(i); dec(j); end; until i>j;
if i<h then qsort(i,h,k,a); if j>l then qsort(l,j,k,a); end;
procedure work_sa(s:ansistring; var sa:arr);
var k,i:longint;
begin
for i:= to n do begin sa[i]:=i; rank[i]:=ord(s[i]); end;
k:=;
while k<=n do
begin
qsort(,n,k,sa);
tmp[sa[]]:=;
for i:= to n do
tmp[sa[i]]:=tmp[sa[i-]]+compare(sa[i-],sa[i],k);
rank:=tmp;
k:=k*;
end;
end;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;
procedure work_lcp(s:ansistring;var sa,lcp:arr);
var i,j,h:longint;
begin
for i:= to n do rank[sa[i]]:=i;
h:=; lcp[]:=; sa[]:=;rank[]:=;
for i:= to n do
begin
j:=sa[rank[i]-];
if h> then dec(h);
while (i+h<=n)and(j+h<=n) do
begin
if s[i+h]<>s[j+h] then break; inc(h);
end;
lcp[rank[i]-]:=h;
end;
end;
begin
readln(u);
for l:= to u do
begin
readln(s1); readln(s2);
s:=s1+'@'+s2;
t:=length(s1);
n:=length(s); work_sa(s,sa);
work_lcp(s,sa,lcp); ans:=;
for i:= to n- do begin
if ((sa[i]<=t)and(sa[i+]>=t+))or((sa[i+]<=t)and(sa[i]>=t+)) then ans:=max(ans,lcp[i]);
end;
writeln('Nejdelsi spolecny retezec ma delku ',ans,'.');
end;
end.
POJ 2217:Secretary(后缀数组)的更多相关文章
- POJ 2217 Secretary (后缀数组)
标题效果: 计算两个公共串串最长的字符串的长度. IDEAS: 这两个组合的字符串. 然后直接确定运行后缀数组height 然后,你可以直接扫描一次height .加个是不是在一个串中的推断就能够了. ...
- POJ 2217 LCS(后缀数组)
Secretary Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1655 Accepted: 671 Descript ...
- POJ 2217 Secretary
Secretary Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: ...
- POJ 2406 KMP/后缀数组
题目链接:http://poj.org/problem?id=2406 题意:给定一个字符串,求由一个子串循环n次后可得到原串,输出n[即输出字符串的最大循环次数] 思路一:KMP求最小循环机,然后就 ...
- POJ 1743-POJ - 3261~后缀数组关于最长字串问题
POJ 1743 题意: 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1~~88范围内的整数,现在要找一个重复的主题.“主题”是整个音符序列的一个子串,它需 ...
- POJ - 1226 Substrings (后缀数组)
传送门:POJ - 1226 这个题跟POJ - 3294 和POJ - 3450 都是一样的思路,一种题型. POJ - 3294的题解可以见:https://www.cnblogs.com/li ...
- POJ2217 Secretary 后缀数组&&高度数组
学后缀数组后的一道裸题.先来讲讲收获,作为字符串初学者,后缀数组也是刚刚在学,所幸的是有一篇好的论文<后缀数组--处理字符串的有力工具>by 罗穗骞,里面非常详尽地介绍了有关后缀数组的概念 ...
- Maximum repetition substring(POJ - 3693)(sa(后缀数组)+st表)
The repetition number of a string is defined as the maximum number \(R\) such that the string can be ...
- Milk Patterns POJ - 3261(后缀数组+二分)
题意: 求可重叠的最长重复子串,但有一个限制条件..要至少重复k次 解析: 二分枚举k,对于连续的height 如果height[i] >= k 说明它们至少有k个元素是重复的,所以判断一下就好 ...
- POJ 3581 Sequence(后缀数组)
Description Given a sequence, {A1, A2, ..., An} which is guaranteed A1 > A2, ..., An, you are to ...
随机推荐
- 动态规划专题(五)——斜率优化DP
前言 斜率优化\(DP\)是难倒我很久的一个算法,我花了很长时间都难以理解.后来,经过无数次的研究加以对一些例题的理解,总算啃下了这根硬骨头. 基本式子 斜率优化\(DP\)的式子略有些复杂,大致可以 ...
- Tarjan在图论中的应用(一)——用Tarjan来实现强连通分量缩点
前言 \(Tarjan\)是一个著名的将强连通分量缩点的算法. 大致思路 它的大致思路就是在图上每个联通块中任意选一个点开始进行\(Tarjan\)操作(依据:强连通分量中的点可以两两到达,因此从任意 ...
- 19课 Vue第二节
事件修饰符 stop 禁止冒泡once 单次事件prevent 阻止默认事件native 原生事件(组件)keycode|name 筛选按键 组合键 : @keydown.ctrl.enter s ...
- Java代码工具箱之解析单行单列简单Excel
1. 使用开源工具 jxl.jar 2. 功能:解析常规Excel.xls格式测试可行,xlsx未测试.Excel测试格式为常规类似table这种简单布局文件.第一行为标题,后面行为内容.代码 可正确 ...
- popen和pclose详解及实例
popen函数是标准c提供的一个管道创建函数,其内部操作主 要是创建一个管道,调用fork创建子进程,关闭不需用的文件描述符,调用exec函数族执行popen的第一个参数.然后等到关闭. 也就是说我们 ...
- SpringVC 拦截器+自定义注解 实现权限拦截
1.springmvc配置文件中配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns= ...
- Microsoft .Net framework 4.0出现 安装不成功,错误代码0x80240037 的解决方法
,安装Microsoft .Net framework 时出现 解决方法:用QQ管家 之后 以上就解决了
- ZendFramework-2.4 源代码 - 关于MVC - View层 - 控制器返回值
<?php class ReturnController extends AbstractActionController { public function returnAction() { ...
- Uva:11401-Triangle Counting
Triangle Counting Time limit1000 ms Description You are given n rods of length 1, 2-, n. You have to ...
- C#小知识点积累
1.sealed 修饰符 概念: C#提出了一个密封类(sealed class)的概念,帮助开发人员来解决这一问题. 密封类在声明中使用sealed 修饰符,这样就可以防止该类被其它类继承.如果试图 ...