搜索
查看: 327|回复: 4
打印 上一主题 下一主题

求助!SA不知道哪里写错了

[复制链接]
跳转到指定楼层
楼主
 楼主| 发表于 2018-5-5 10:50:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
SA倍增法模板,奇怪的WA了一个点

#include <cstdio>
#include <iostream>

#define maxn 1200000

int C[maxn], T[maxn], T2[maxn], SA[maxn];
int build_sa(std::string S, int m) {
    int n = S.length();
    int *X=T, *Y=T2;
    for (int i=0;i<n;++i) Y[i]=0;
    for (int i=0;i<m;++i) C[i]=0;
    for (int i=0;i<n;++i) C[X[i]=S[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;
   // printf("SA:"); for (int i = 0;i<n;++i) printf("%d ", SA[i]); printf("\n");
    for (int k=1;k<=n;k<<=1) {
        int p=0;
        //for (int i=0;i<n;++i) Y[i]=0;
        for (int i=n-k;i<n;++i) Y[p++]=i;
        for (int i=0;i<n;++i) if (SA[i]>=k) Y[p++]=SA[i]-k;
        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];
        p=1; std::swap(X, Y); X[SA[0]]=0;
        for (int i=0;i<n;++i) X[SA[i]]=Y[SA[i-1]]==Y[SA[i]]&&Y[SA[i-1]+k]==Y[SA[i]+k]?p-1:p++;
        if (p>=n) break;
        m=p;
        //printf("SA:"); for (int i = 0;i<n;++i) printf("%d ", SA[i]); printf("\n");
    }
}


int main() {
    std::string s;
    std::cin >> s;
    build_sa(s, 300); int n=s.length();
    for (int i =0;i<n;++i) printf("%d ", SA[i]+1);
    return 0;
}

沙发
 楼主| 发表于 2018-5-5 14:17:32 | 只看该作者
问题已解决               

点评

呃……  发表于 2018-5-5 17:28
板凳
发表于 2018-5-5 20:28:25 | 只看该作者
kkkkkkkkkkkkkgggggggg

点评

……  发表于 2018-5-5 20:40
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表