poj2217 Secretary 后缀数组
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
int T, n, m, p, len, r[20005], c[20005], x[20005], y[20005], sa[20005];
int rank[20005], ans, hei[20005];
string s, t;
void getSa(){
r[n++] = 0;
for(int i=0; i<m; i++) c[i] = 0;
for(int i=0; i<n; i++) c[x[i]=r[i]]++;
for(int i=1; i<m; i++) c[i] += c[i-1];
for(int i=n-1; i>=0; i--) sa[--c[x[i]]] = i;
for(int j=1; p<n; j*=2, m=p){
p = 0;
for(int i=n-j; i<n; i++) y[p++] = i;
for(int i=0; i<n; i++) if(sa[i]>=j) y[p++] = sa[i] - j;
for(int i=0; i<m; i++) c[i] = 0;
for(int i=0; i<n; i++) c[x[y[i]]]++;
for(int i=1; i<m; i++) c[i] += c[i-1];
for(int i=n-1; i>=0; i--) sa[--c[x[y[i]]]] = y[i];
swap(x, y);
p = 1;
x[sa[0]] = 0;
for(int i=1; i<n; i++)
if(y[sa[i-1]]==y[sa[i]] && y[sa[i-1]+j]==y[sa[i]+j])
x[sa[i]] = p - 1;
else
x[sa[i]] = p++;
}
n--;
}
void getLcp(){
int h=0;
for(int i=1; i<=n; i++) rank[sa[i]] = i;
for(int i=0; i<n; i++){
if(h) h--;
int j=sa[rank[i]-1];
while(r[i+h]==r[j+h]) h++;
hei[rank[i]] = h;
}
}//构建height数组
int main(){
cin>>T;
getline(cin, s);
while(T--){
getline(cin, s);
getline(cin, t);
len = s.size();
s = s + "$" + t;
n = s.size();
m = 128;
ans = p = 0;
for(int i=0; i<n; i++) r[i] = (int)s[i];
getSa();
getLcp();
for(int i=2; i<=n; i++)
if((sa[i-1]<len)^(sa[i]<len))
ans = max(ans, hei[i]);
printf("Nejdelsi spolecny retezec ma delku %d.\n", ans);
}
return 0;
}
poj2217 Secretary 后缀数组的更多相关文章
- POJ2217 Secretary 后缀数组&&高度数组
学后缀数组后的一道裸题.先来讲讲收获,作为字符串初学者,后缀数组也是刚刚在学,所幸的是有一篇好的论文<后缀数组--处理字符串的有力工具>by 罗穗骞,里面非常详尽地介绍了有关后缀数组的概念 ...
- POJ 2217 Secretary (后缀数组)
标题效果: 计算两个公共串串最长的字符串的长度. IDEAS: 这两个组合的字符串. 然后直接确定运行后缀数组height 然后,你可以直接扫描一次height .加个是不是在一个串中的推断就能够了. ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- POJ1743 Musical Theme [后缀数组]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- 后缀数组(suffix array)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
随机推荐
- Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理
http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...
- javascript要点(上)
立即执行函数 即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行.它没有绑定任何事件,也无需等待任何异步操作: ( ...
- Partition(线段树的离线处理)
有一点类似区间K值的求法. 这里有两颗树,一个是自己建的线段树,一个是题目中给定的树.以线段树和树进行区分. 首先离散化一下,以离散化后的结果建线段树,线段树的节点开了2维,一维保存当前以当前节点为权 ...
- DB2中横表纵表互换
1.列转行:创建一个如下的表drop table dwtmp.tmp_xn_lsb; create table dwtmp.tmp_xn_lsb ( year int ,quarter ...
- bootstrap输入框组、导航和导航条
输入框组(input groups) 避免使用select 支持不好,使用输入框组 尺寸根据 input-group-lg input-group-sm来选择 <div class ...
- java maven cxf笔记
IDE: 一:新建Maven项目 1.File->New->Project.. 2. 3. 4. 二:添加cxf和jetty依赖 <dependencies> <!- ...
- bat 批处理测试局域网速度 两端电脑
C:\Users\Administrator>iperf3 iperf3: parameter error - must either be a client (-c) or server (- ...
- COGS 133. [USACO Mar08] 牛跑步
★★★ 输入文件:cowjog.in 输出文件:cowjog.out 简单对比时间限制:1 s 内存限制:128 MB Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她 ...
- 并查集+思维——The Door Problem
一.问题描述(题目链接) 有n个门和m个开关,每个开关可以控制任意多的门,每个门严格的只有两个开关控制,问能否通过操作某些开关使得所有门都打开.(给出门的初始状态). 二.问题分析 大部分开关问题首先 ...
- 打印两个有序链表的公共部分 【题目】 给定两个有序链表的头指针head1和head2,打印两个 链表的公共部分
简单题 package my_basic.class_3; public class Code_10_PrintCommonPart { public static class Node{ int v ...