后缀数组:SPOJ SUBST1 - New Distinct Substrings
2016-02-16 21:27
423 查看
Given a string, we need to find the total number of its distinct substrings.
Input
T- number of test cases. T<=20; Each test case consists of one string, whose length is <= 50000Output
For each test case output one number saying the number of distinct substrings.Example
Input: 2 CCCCC ABABA Output: 5 9 题意:求一个字符串有多少不同子串 LCP的应用,会打后缀数组的模板后就十分简单了 后缀数组的理解: http://www.cnblogs.com/staginner/archive/2012/02/02/2335600.html
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> const int maxn=50010; char S[maxn]; int r[maxn],wa[maxn],wb[maxn],wv[maxn],ws[maxn],sa[maxn]; bool cmp(int *p,int i,int j,int l) {return p[i]==p[j]&&p[i+l]==p[j+l];} void DA(int n,int m) { int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) ws[i]=0; for(i=0;i<n;i++) ++ws[x[i]=r[i]]; for(i=1;i<m;i++) ws[i]+=ws[i-1]; for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i; for(j=1,p=1;p<n;j<<=1,m=p) { for(p=0,i=n-j;i<n;i++) y[p++]=i; for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j; for(i=0;i<n;i++) wv[i]=x[y[i]]; for(i=0;i<m;i++) ws[i]=0; for(i=0;i<n;i++) ++ws[wv[i]]; for(i=1;i<m;i++) ws[i]+=ws[i-1]; for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } } int rank[maxn],lcp[maxn]; void LCP(int n) { int i,j,k=0; for(i=1;i<=n;i++) rank[sa[i]]=i; for(i=0;i<n;lcp[rank[i++]]=k) for(k?k--:k,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); } int main() { int Q; scanf("%d",&Q); while(~scanf("%s",S)) { int i,n; long long ans=0; for(i=0;S[i];i++) r[i]=S[i]; DA(i+1,128); LCP(i); n=i; for(i=0;i<n;i++) ans+=n-i-lcp[rank[i]]; printf("%d\n",ans); } return 0; }
相关文章推荐
- Button ToggleButton Spinner Adapter Inflate
- 关于字符型数组存放宽度问题
- C++多态性
- 面板组件-盒布局
- 浅析计算机接口技术
- Codeforces 626A Robot Sequence
- 什么是引力波
- 十大编程算法助程序员走上高手之路
- 从头认识Spring-2.5 @Autowire @Inject @Qualifier @Named的相同与不同
- readv和writev函数
- hdoj4956Poor Hanamichi【暴力】
- 20160204.CCPP体系详解(0014天)
- Unity中关于单位像素与单位长度的关系
- Objective - C NSArray不可变数组和NSMutableArray可变数组
- HUST 1017 Exact Cover(舞蹈链模板)
- LeetCode55. Jump Game
- 转知乎:如何阅读源代码-- 源码理解不是读出来的,是用来debug出来的.
- WF4.0和BookMark
- 使用devpartner的blockchecker检查c++内存错误
- POJ 3734_Blocks