• spoj705


    题解:

    后缀数组求出height

    然后ans=所有串-所有height

    代码:

    #include<bits/stdc++.h> 
    using namespace std;  
    const int N=10005;
    int t,ans,n,m,wa[N],wb[N],wsf[N],wv[N],sa[N],rank[N],height[N],s[N],a[N];  
    char str[N],str1[N],str2[N];   
    int cmp(int *r,int a,int b,int k)  
    {  
        return r[a]==r[b]&&r[a+k]==r[b+k];  
    }  
    void getsa(int *r,int *sa,int n,int m)
    {  
        int *x=wa,*y=wb;  
        for (int i=0;i<m;i++)wsf[i]=0;  
        for (int i=0;i<n;i++)wsf[x[i]=r[i]]++;  
        for (int i=1;i<m;i++)wsf[i]+=wsf[i-1];  
        for (int i=n-1;i>=0;i--)sa[--wsf[x[i]]]=i;  
        for (int p=1,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<n;i++)wv[i]=x[y[i]];  
            for (int i=0;i<m;i++)wsf[i]=0;  
            for (int i=0;i<n;i++)wsf[wv[i]]++;  
            for (int i=1;i<m;i++)wsf[i]+=wsf[i-1];  
            for (int i=n-1;i>=0;i--)sa[--wsf[wv[i]]]=y[i];  
            swap(x,y);x[sa[0]]=0;p=1;
            for (int i=1;i<n;i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;  
         }  
    }  
    void getheight(int *r,int n)
    {  
        int j,k=0;  
        for (int i=1;i<=n;i++)rank[sa[i]]=i;  
        for (int i=0;i<n;i++)  
         {   
            if (k)k--;  
            else k=0;  
            j=sa[rank[i]-1];  
            while (r[i+k]==r[j+k])k++;  
            height[rank[i]]=k;  
         }  
    }  
    int main()  
    {  
        scanf("%d",&t);  
        while (t--)  
         {  
            scanf("%s",str);  
            int len=strlen(str);  
            for (int i=0;i<len;i++)s[i]=str[i];  
            s[len]=0;  
            getsa(s,sa,len+1,300);  
            getheight(s,len);  
            int ans=(1+len)*len/2;  
            for (int i=2;i<=len;i++)ans-=height[i];  
            printf("%d
    ",ans);  
         }  
    }  
  • 相关阅读:
    Javascript一天学完系列(四)函数上下文bind &call
    Javascript一天学完系列(三)JavaScript面向对象
    Javascript一天学完系列(二)Callbacks回调函数
    Python(切片)
    水果篮子(母函数)
    判断链表是否有环
    链表部分逆置
    Python(List和Tuple类型)
    HDU1426(DFS)
    HDU4474(数位BFS)
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8544174.html
Copyright © 2020-2023  润新知