【SPOJ705】New Distinct Substrings 后缀数组
来源:互联网 发布:外貌协会的女生知乎 编辑:程序博客网 时间:2024/06/05 06:46
题目描述
Given a string, we need to find the total number of its distinct substrings.
题目大意
求一个字符串有多少个不同的子串。
数据范围
长度小于200000,中间可能有空格。
样例输入
ABABA
样例输出
9
解题思路
后缀数组,求出sa,rank,height。对于每一个新的后缀,则会产生它的长度个前缀,但其中是有重复的,需要减掉。height[i]=LCP(rank[i],rank[i-1]),所以答案就是
∑i=1n(n−Sai−Heighti+1)
还有就是答案会爆int虽然这很显然
代码
#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>using namespace std;inline int Getint(){int x=0,f=1;char ch=getchar();while('0'>ch||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}namespace Suffix_Array{ #define Suffix_Maxn 200005 char s[Suffix_Maxn]; int a[Suffix_Maxn],sa[2][Suffix_Maxn],rk[2][Suffix_Maxn],height[Suffix_Maxn],v[Suffix_Maxn]; int Sa[Suffix_Maxn],Rank[Suffix_Maxn]; int k,n,p=0,q=1; void Mul(int *rk,int *sa,int *RK,int *SA){ for(int i=1;i<=n;i++)v[rk[sa[i]]]=i; for(int i=n;i>=1;i--)if(sa[i]>k)SA[v[rk[sa[i]-k]]--]=sa[i]-k; for(int i=n-k+1;i<=n;i++)SA[v[rk[i]]--]=i; for(int i=1;i<=n;i++)RK[SA[i]]=RK[SA[i-1]]+(rk[SA[i]]!=rk[SA[i-1]]||(rk[SA[i]+k]!=rk[SA[i-1]+k])); } void Suffix_Init(int m){ for(int i=1;i<=n;i++)v[a[i]]++; for(int i=1;i<=m;i++)v[i]+=v[i-1]; for(int i=n;i>=1;i--)sa[p][v[a[i]]--]=i; for(int i=1;i<=n;i++)rk[p][sa[p][i]]=rk[p][sa[p][i-1]]+(a[sa[p][i-1]]!=a[sa[p][i]]); for(k=1;k<n;k<<=1,swap(p,q))Mul(rk[p],sa[p],rk[q],sa[q]); memcpy(Sa,sa[p],sizeof(sa[p])); memcpy(Rank,rk[p],sizeof(rk[p])); for(int i=1,k=0;i<=n;i++){ int j=Sa[Rank[i]-1]; while(a[i+k]==a[j+k])k++; height[Rank[i]]=k; if(k>0)k--; } }}using namespace Suffix_Array;int main(){ gets(s); n=strlen(s); for(int i=1;i<=n;i++)a[i]=s[i-1]; Suffix_Init(666); unsigned long long Ans=0; for(int i=1;i<=n;i++) Ans+=n-Sa[i]-height[i]+1; cout<<Ans<<"\n"; return 0;}
0 0
- 【SPOJ705】New Distinct Substrings 后缀数组
- [后缀数组]spoj694 Distinct Substrings/spoj705 New Distinct Substrings
- SPOJ694&&SPOJ705:Distinct Substrings(后缀数组)
- SPOJ694&&SPOJ705:Distinct Substrings (后缀数组)
- [SPOJ705]DISUBSTR - Distinct Substrings(后缀数组)
- 【SPOJ705】New Distinct Substrings(BSOI3580)
- SPOJ 694. Distinct Substrings,705. New Distinct Substrings(后缀数组)
- spoj -705 New Distinct Substrings--后缀数组
- SPOJ 705 New Distinct Substrings (后缀数组)
- SPOJ 705 New Distinct Substrings 后缀数组
- 【SPOJ-SUBST1】New Distinct Substrings【后缀数组】
- SPOJ 705 New Distinct Substrings 后缀数组
- SPOJ New Distinct Substrings(后缀数组)
- Distinct Substrings后缀数组
- Distinct Substrings 后缀数组
- SPOJ 705 SUBST1 New Distinct Substrings 后缀数组
- SPOJ SUBST1 New Distinct Substrings 后缀数组-子串个数
- SPOJ SUBST1 New Distinct Substrings(后缀数组)
- caffe小显存问题
- 蓝桥杯之分解质因数
- (ssl1632)P1282 多米诺骨牌
- Unity3d——GFootball_03:镜头跟随球员
- C#使用cmd更改IP地址
- 【SPOJ705】New Distinct Substrings 后缀数组
- DL学习笔记【17】nn包中的各位Convolutional layers
- SSH学习之Session接口的常用方法
- JAVA中创建对象的四种方式
- "Could not resolve placeholder"解决方案
- 腾讯EC .net API对接第三方系统
- 【Jenkins】——Jenkins+jmeter 定时测试
- 苹果-SSL 1637
- 散列表(Hash Table)