后缀数组模板

模板题:UOJ35
终于可以不看板子写出后缀数组了开心【捂脸】
但还是贴一下板子吧。
要记得开双倍数组qvq

#include <bits/stdc++.h>
#define N 200010
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define per(i,r,l) for (int i=r;i>=l;i--)
using namespace std;
int n,wa[N],wb[N],cnt[N],sa[N],r[N],h[N];
char s[N];

template <class Aqua>
inline void read(Aqua &s){
    s=0; Aqua f=1; char c=getchar();
    while (!isdigit(c)) {if (c=='-') f=-1; c=getchar();}
    while (isdigit(c)) s=s*10+c-'0',c=getchar();
    s*=f;
}

inline bool cmp(int *y,int a,int b,int len){
    return (y[a]==y[b] && y[a+len]==y[b+len]);
}

void da(int m){
    int j,k,p(0),*x=wa,*y=wb;
    rep(i,0,m) cnt[i]=0;
    rep(i,1,n)
        cnt[x[i]=s[i]-96]++;
    rep(i,1,m)
        cnt[i]+=cnt[i-1];
    per(i,n,1)
        sa[cnt[x[i]]--]=i;
    for (j=p=1;p<n;j<<=1,m=p+1){
        k=0;
        rep(i,n-j+1,n)
            y[++k]=i;
        rep(i,1,n)
            if (sa[i]>j)
                y[++k]=sa[i]-j;
        rep(i,0,m) cnt[i]=0;
        rep(i,1,n)
            cnt[x[y[i]]]++;
        rep(i,1,m)
            cnt[i]+=cnt[i-1];
        per(i,n,1)
            sa[cnt[x[y[i]]]--]=y[i];
        for (swap(x,y),k=2,x[sa[p=1]]=1;k<=n;k++)
            x[sa[k]]=cmp(y,sa[k-1],sa[k],j)?p:++p;
    }
    rep(i,1,n)
        printf("%d ",sa[i]);
    puts("");
}

void getheight(){
    int ht=0;
    rep(i,1,n)
        r[sa[i]]=i;
    rep(i,1,n){
        if (ht) ht--;
        if (r[i]==1) continue;
        while (s[i+ht]==s[sa[r[i]-1]+ht]) ht++;
        h[r[i]]=ht;
    }
    rep(i,2,n)
        printf("%d ",h[i]);
    puts("");
}

int main(){
    scanf("%s",s+1);
    n=strlen(s+1);
    da(27);
    getheight();
    return 0;
}
### 创建和操作双精度浮点数数组 在 Python 中,可以利用 NumPy 库来高效地处理数值数据,特别是当涉及到创建或操作双精度浮点数类型的数组时。NumPy 提供了一个名为 `numpy.array` 的函数用于构建数组对象,并允许指定元素的数据类型。 对于创建一个包含双精度浮点数(即 float64 类型)的一维或多维数组,可以通过传递带有适当 dtype 参数的列表给 numpy.array 函数实现: ```python import numpy as np # 创建一维double数组 one_d_double_array = np.array([1.0, 2.0, 3.0], dtype=np.float64) # 创建二维double数组 two_d_double_array = np.array([[1.0, 2.0], [3.0, 4.0]], dtype=np.float64) ``` 为了访问这些数组中的特定位置或者切片部分,语法类似于标准 Python 列表的操作方式[^2]: ```python print(one_d_double_array[0]) # 访问第一个元素 print(two_d_double_array[0][1]) # 或者写作 two_d_double_array[0,1] 来获取 (0,1) 处的值 ``` 如果想要修改现有数组的内容,则可以直接通过索引来赋新值: ```python one_d_double_array[0] = 99.9 # 修改 one_d_double_array 的首个元素为新的 double 值 two_d_double_array[1, :] = [7.7, 8.8] # 替换第二行的所有元素 ``` 此外,在某些情况下可能需要动态调整数组大小;然而,由于 NumPy 数组具有固定的尺寸特性,因此通常的做法是在必要时重新分配一个新的更大/更小的空间并复制旧数据过去。不过,对于频繁增删元素的需求场景下,建议考虑使用 Python 内置 list 结构配合 map() 方法转换成所需格式后再转回 ndarray 形式[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值