博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bcl 1387 最长重复子串 (后缀数组)
阅读量:6642 次
发布时间:2019-06-25

本文共 1626 字,大约阅读时间需要 5 分钟。

第一道后缀数组,求出最大的height值即可。更多的是当个模板用吧。

code:

#include<cstdio>
//
最长重复子串
#include<cstring>
const 
int maxn = 
10001 ;
int wa[maxn], wb[maxn], wv[maxn], ws[maxn], rank[maxn], height[maxn], sa[maxn], s[maxn] ;
char str[maxn] ;
int cmp(
int *r,
int a,
int b,
int l){
    
return r[a]==r[b] && r[a+l]==r[b+l] ;
}
void da(
int *r, 
int *sa, 
int n, 
int m){
    
int i, j, p, *x = wa, *y = wb, *t ;
    
for(i=
0; i<m; i++) ws[i] = 
0 ;
    
for(i=
0; i<n; i++) ws[x[i]=r[i]] ++ ;
    
for(i=
1; i<m; i++) ws[i] += ws[i-
1] ;
    
for(i=n-
1; i>=
0; i--) sa[--ws[x[i]]] = i ;
    
for(j=
1,p=
1; p<n; j*=
2, m=p){
        
for(p=
0,i=n-j; i<n; i++) y[p++] = i ;
        
for(i=
0; i<n; i++) 
if(sa[i]>=j) y[p++] = sa[i] - j ;
        
for(i=
0; i<n; i++) wv[i] = x[y[i]] ;
        
for(i=
0; i<m; i++) ws[i] = 
0 ;
        
for(i=
0; i<n; i++) ws[wv[i]] ++ ;
        
for(i=
1; i<m; i++) ws[i] += ws[i-
1] ;
        
for(i=n-
1; i>=
0; i--) sa[--ws[wv[i]]] = y[i] ;
        
for(t=x, x=y, y=t, p=
1, x[sa[
0]]=
0, i=
1; i<n; i++)
        x[sa[i]] = cmp(y, sa[i-
1], sa[i], j) ? p - 
1 : p ++ ;
    }
    
return ;
}
void calheight(
int *r,
int *sa,
int n){
    
int i, j, k = 
0 ;
    
for(i=
1; i<=n; i++) rank[sa[i]] = i ;
//
获取rank值 O(n)
    
for(i=
0; i<n; height[rank[i++]]=k)
    
for(k?k--:
0, j=sa[rank[i]-
1]; r[i+k]==r[j+k]; k++) ;
    
return ;
}
int main(){
    
int t, n, i, j, max ;
    scanf(
"
%d
", &t) ;
    
while(t--){
        scanf(
"
%s
", str) ;
        n = strlen(str) ;
        
for(i=
0; i<n; i++)
            s[i] = (
int)str[i] ;
        s[n] = 
0 ;
        da(s, sa, n+
1
255) ;
        calheight(s, sa, n) ;
        max = 
0 ;
        
for(i=
1; i<=n; i++)
            
if(max<height[i])
                max = height[i], j = sa[i] ;
        
for(i=j; i-j<max; i++)
            printf(
"
%c
", str[i]) ;
        printf(
"
\n
") ;
    }
    
return 
0 ;} 

转载于:https://www.cnblogs.com/xiaolongchase/archive/2012/04/03/2431196.html

你可能感兴趣的文章
canvas元素简易教程(3)(大部分转自火狐,自己只写了简单的代码分析)
查看>>
16位汇编第第四讲常用的7种寻址方式
查看>>
jchdl - GSL实例 - Mux4
查看>>
java annotation processor tools(error:annotation processor xx not found 错误:找不到注解处理程序xx)...
查看>>
观察者模式 - 两国打仗靠间谍
查看>>
kafka学习笔记——基本概念与安装
查看>>
C++中cout和cerr的区别?
查看>>
nginx+tomcat配置https
查看>>
【LeetCode】19. Remove Nth Node From End of List
查看>>
Hello,C++(3)类和对象
查看>>
安装上DBArtisan链接sybase数据库后,报缺少libct.dll和libcs.dll文件
查看>>
.Net Framework介绍
查看>>
魅族机型问题
查看>>
BZOJ 2427: [HAOI2010]软件安装
查看>>
sql server08 查询优化系列 2系统性能分析
查看>>
android MediaCodec 音频编解码的实现——转码
查看>>
Mysql Join语法解析与性能分析
查看>>
【sublime】sublime Text 3 javaScript代码自动提示插件&安装步骤 &启动Debug模式
查看>>
CentOS-5安装配置PowerDNS服务器
查看>>
记载今天的一次经验,
查看>>