SPOJ 694 Distinct Substrings(后缀数组)
2016-05-03 14:38
423 查看
Description
给出一个字符串,求这个串不同的子串个数
Input
第一行为一整数T(T<=20)表示用例组数,每组用例占一行为一个长度不超过1000的字符串
Output
对于每组用例,输出这个串的不同子串个数
Sample Input
2
CCCCC
ABABA
Sample Output
5
9
Solution
不同子串数量=n*(n+1)-sum(height[i]),i=2,3,…,n
即子串总数减去重复字串数量,重复子串就是后缀的公共前缀数量
Code
给出一个字符串,求这个串不同的子串个数
Input
第一行为一整数T(T<=20)表示用例组数,每组用例占一行为一个长度不超过1000的字符串
Output
对于每组用例,输出这个串的不同子串个数
Sample Input
2
CCCCC
ABABA
Sample Output
5
9
Solution
不同子串数量=n*(n+1)-sum(height[i]),i=2,3,…,n
即子串总数减去重复字串数量,重复子串就是后缀的公共前缀数量
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define maxn 1111 int t1[maxn],t2[maxn],c[maxn],sa[maxn],rank[maxn],height[maxn]; bool cmp(int *r,int a,int b,int l) { return r[a]==r[b]&&r[a+l]==r[b+l]; } void da(int str[],int n,int m) { n++; 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]=str[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]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; if(p>=n)break; m=p; } int k=0; n--; 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(str[i+k]==str[j+k])k++; height[rank[i]]=k; } } int T,n,a[maxn]; char s[maxn]; int main() { scanf("%d",&T); while(T--) { scanf("%s",s); n=strlen(s); for(int i=0;i<n;i++)a[i]=s[i]; a =0; da(a,n,333); int ans=n*(n+1)/2; for(int i=2;i<=n;i++)ans-=height[i]; printf("%d\n",ans); } return 0; }
相关文章推荐
- 调整合适的画布尺寸(游戏)
- 快速高效学习Java编程在线资源Top 20
- 文件读写
- 50个网络安全工具
- 静态代理
- 基于webmagic的爬虫小应用--爬取知乎用户信息
- 图像去模糊(逆滤波)
- Java异常总结
- JS挂马攻防
- 用线性插值算法实现图像缩放
- NVL2
- android 的六种依赖关系
- 如何看待产品的计划发布日期?
- UIPageViewController
- 前后端数据交互总结
- rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm
- ImageNet Classification with Deep Convolutional Neural Networks 阅读笔记
- 学习:java原理—反射机制
- 第一个Java程序,你好java世界
- 解决react-native run-android 的时候报错connection time out