SPOJ 题目694 Distinct Substrings(后缀数组,求不同的子串个数)
2015-08-18 22:01
381 查看
DISUBSTR - Distinct Substrings
no tagsGiven 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 <= 1000
Output
For each test case output one number saying the number of distinct substrings.
Example
Sample Input:2
CCCCC
ABABA
Sample Output:
5
9
Explanation for the testcase with string ABABA:
len=1 : A,B
len=2 : AB,BA
len=3 : ABA,BAB
len=4 : ABAB,BABA
len=5 : ABABA
Thus, total number of distinct substrings is 9.
ac代码
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int s[2002]; char str[2002]; int sa[2002],t1[2002],t2[2002],c[2002]; int rank[2002],height[2002]; void build_sa(int s[],int n,int m) { int i,j,p,*x=t1,*y=t2; for(i=0;i<m;i++) c[i]=0; for(i=0;i<n;i++) c[x[i]=s[i]]++; for(i=1;i<m;i++) c[i]+=c[i-1]; for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i; for(j=1;j<=n;j<<=1) { p=0; for(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<m;i++) c[i]=0; for(i=0;i<n;i++) c[x[y[i]]]++; for(i=1;i<m;i++) c[i]+=c[i-1]; for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for(i=1;i<n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j]?p-1:p++; if(p>=n) break; m=p; } } void getHeight(int s[],int n) { int i,j,k=0; for(i=0;i<=n;i++) rank[sa[i]]=i; for(i=0;i<n;i++) { if(k) k--; j=sa[rank[i]-1]; while(s[i+k]==s[j+k]) k++; height[rank[i]]=k; } } int main() { int t; scanf("%d",&t); while(t--) { int i; scanf("%s",str); int len=strlen(str); for(i=0;i<len;i++) { s[i]=str[i]; } s[len]=0; build_sa(s,len+1,128); getHeight(s,len); long long ans=(len)*(len+1)/2; for(i=1;i<=len;i++) { ans-=height[i]; } printf("%lld\n",ans); } }
相关文章推荐
- Poj 1321 棋盘问题
- iOS 任意圆角button,左圆右直,左直右圆,上圆下直,上直下圆
- 回文判断
- light oj 1248 第六周E题(期望)
- 【MySQL for Mac】终极解决——MySQL在Mac的字符集设置
- 高效e人注册码 EfficientPIM Pro 5.0 Build 505
- 使用apache配置进行简单的HTTP Basic Authentication
- hdu 2566 放大的X
- 试题系列三(求任意两个数的最大公约数)
- 修改ramdisk文件总结
- Path的配置问题
- 高性能缓存服务器Squid架构配置
- RT-Thread finsh源码分析: finsh_error.c
- Android的五种布局
- Linux压缩包的制作与解压
- 的士
- 2015年8月18日工作日志--------赵鑫
- 2015 7 1 java核心技术 卷1 第6章 接口与内部类
- BZOJ 1698 [Usaco2007 Feb]Lilypad Pond 荷叶池塘 BFS+最短路
- 蓝牙4.0BLE cc2540 cc2541 ios OAD课程(空中固件升级)[原版的,多图]