【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)
2018-01-25 10:54
615 查看
【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)
题面
Vjudge1Vjudge2
题解
要求的是串的不同的子串个数两道一模一样的题目
其实很容易:
总方案-不合法方案数
对于串进行后缀排序后
不合法方案数=相邻两个串的不合法方案数的和
也就是\(height\)的和
所以\[ans=\frac{n(n+1)}{2}-\sum_{i=1}^{len}height[i]\]
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std; #define MAX 60000 int n; int SA[MAX],x[MAX],y[MAX],t[MAX]; int height[MAX],rk[MAX],a[MAX]; char ch[MAX]; void init() { memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(t,0,sizeof(t)); memset(SA,0,sizeof(SA)); memset(rk,0,sizeof(rk)); memset(height,0,sizeof(height)); } bool cmp(int i,int j,int k){return y[i]==y[j]&&y[i+k]==y[j+k];} void GetSA() { int m=50000; for(int i=1;i<=n;++i)t[x[i]=a[i]]++; for(int i=1;i<=m;++i)t[i]+=t[i-1]; for(int i=n;i>=1;--i)SA[t[x[i]]--]=i; for(int k=1;k<=n;k<<=1) { int p=0; for(int i=n-k+1;i<=n;++i)y[++p]=i; for(int i=1;i<=n;++i)if(SA[i]>k)y[++p]=SA[i]-k; for(int i=0;i<=m;++i)t[i]=0; for(int i=1;i<=n;++i)t[x[y[i]]]++; for(int i=1;i<=m;++i)t[i]+=t[i-1]; for(int i=n;i>=1;--i)SA[t[x[y[i]]]--]=y[i]; swap(x,y); x[SA[1]]=p=1; for(int i=2;i<=n;++i) x[SA[i]]=cmp(SA[i],SA[i-1],k)?p:++p; if(p>=n)break; m=p; } for(int i=1;i<=n;++i)rk[SA[i]]=i; for(int i=1,j=0;i<=n;++i) { if(j)--j; while(a[i+j]==a[SA[rk[i]-1]+j])++j; height[rk[i]]=j; } } int main() { int T; scanf("%d",&T); while(T--) { init(); scanf("%s",ch+1); n=strlen(ch+1); for(int i=1;i<=n;++i)a[i]=ch[i]; GetSA(); long long ans=1ll*n*(n+1)/2; for(int i=1;i<=n;++i)ans-=height[i]; printf("%lld\n",ans); } return 0; }
相关文章推荐
- SPOJ-SUBST1 New Distinct Substrings(后缀数组)
- SPOJ694&&SPOJ705 DISUBSTR - Distinct Substrings && SUBST1 - New Distinct Substrings 后缀数组
- New Distinct Substrings SPOJ - SUBST1 (后缀数组)
- SPOJ New Distinct Substrings(后缀数组)
- SPOJ SUBST1 - New Distinct Substrings (后缀数组)
- SPOJ - SUBST1 New Distinct Substrings 后缀数组
- SPOJ_705_New Distinct Substrings_后缀数组
- SPOJ 705 New Distinct Substrings 后缀数组
- 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)
- 后缀数组:SPOJ SUBST1 - New Distinct Substrings
- SPOJ 705 New Distinct Substrings (后缀数组)
- SPOJ705-New Distinct Substrings-后缀数组
- spoj -705 New Distinct Substrings--后缀数组
- [spoj694&spoj705]New Distinct Substrings(后缀数组)
- SPOJ 705 New DistinctSubstrings (后缀数组)
- SPOJ 694 Distinct Substrings/SPOJ 705 New Distinct Substrings(后缀数组)
- SPOJ 694、705 Distinct Substrings 、 New Distinct Substrings (后缀数组)
- [SPOJ]DISUBSTR:Distinct Substrings&[SPOJ]SUBST1:New Distinct Substrings
- SPOJ SUBST1 New Distinct Substrings
- [后缀数组]spoj694 Distinct Substrings/spoj705 New Distinct Substrings