spoj694 DISUBSTR - Distinct Substrings

Posted poorpool

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spoj694 DISUBSTR - Distinct Substrings相关的知识,希望对你有一定的参考价值。

不相同子串个数。
参考那篇论文。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m, p, x[1005], y[1005], c[1005], sa[1005], rnk[1005], hei[1005];
int ans, T;
char s[1005];
void getSa(){
    s[n++] = 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;
    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);
        x[sa[0]] = 0;
        p = 1;
        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 getHei(){
    int h=0;
    for(int i=1; i<=n; i++) rnk[sa[i]] = i;
    for(int i=0; i<n; i++){
        if(h)   h--;
        int j=sa[rnk[i]-1];
        while(s[i+h]==s[j+h])   h++;
        hei[rnk[i]] = h;
    }
}
int main(){
    cin>>T;
    while(T--){
        scanf("%s", s);
        n = strlen(s);
        m = 128;
        p = ans = 0;
        getSa();
        getHei();
        for(int i=1; i<=n; i++)
            ans += n - sa[i] - hei[i];//想一想,为什么
        printf("%d\n", ans);
    }
    return 0;
}

以上是关于spoj694 DISUBSTR - Distinct Substrings的主要内容,如果未能解决你的问题,请参考以下文章

SPOJ DISUBSTR ——后缀数组

SPOJ - DISUBSTR Distinct Substrings

Spoj-DISUBSTR - Distinct Substrings~New Distinct Substrings SPOJ - SUBST1~(后缀数组求解子串个数)

[SPOJ-DISUBSTR]Distinct Substrings

Distinct Substrings SPOJ - DISUBSTR(后缀数组水题)

SPOJ DISUBSTR - Distinct Substrings(后缀数组[不相同的子串的个数])