【数据结构】后缀数组

// 字符串处理 后缀数组
void build_sa( char * s ) // 字符串从第一位开始读入,第0位任意填入一个字符便于操作
{
    int j, num, n = strlen( s )-1, m = 200, *x = a1, *y = a2;
    for( int i = 1; i <= m; i++ ) c[i] = 0;
    for( int i = 1; i <= n; i++ ) c[ x[i] = s[i] ]++;
    for( int i = 2; i <= m; i++ ) c[i] += c[i-1];
    for( int i = 1; i <= n; i++ ) sa[ c[ x[i] ]-- ] = i;
    for( int k = 1; k <= n; k <<= 1 )
    {
        num = 0;
        for( int i = n-k+1; i <= n; i++ ) y[++num] = i;
        for( int i = 1; i <= n; i++ ) if( sa[i] > k ) y[++num] = sa[i]-k;
        for( int i = 1; i <= m; i++ ) c[i] = 0;
        for( int i = 1; i <= n; i++ ) c[ x[i] ]++;
        for( int i = 2; i <= m; i++ ) c[i] += c[i-1];
        for( int i = n; i >= 1; i-- ) sa[ c[ x[ y[i] ] ]-- ] = y[i];
        swap( x, y );
        num = 1;
        x[ sa[1] ] = 1;
        for( int i = 2; i <= n; i++ )
            x[ sa[i] ] = y[ sa[i] ] == y[ sa[i-1] ] && y[ sa[i]+k ] == y[ sa[i-1]+k ]? num: ++num;
        if( num == n ) break;
        m = num;
    }
    num = 0;
    for( int i = 1; i <= n; i++ )
    {
        if( x[i] == 1 ) continue;
        if( num ) num--;
        j = sa[ x[i]-1 ];
        while( s[i+num] == s[j+num] ) num++;
        height[ x[i] ] = num;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值