CSU 1632 Repeated Substrings(后缀数组)
来源:互联网 发布:lm555中文数据手册 编辑:程序博客网 时间:2024/05/19 13:26
Description
求字符串中所有出现至少2次的子串个数
Input
第一行为一整数T(T<=10)表示用例组数,每组用例占一行为一个长度不超过100000的字符串
Output
对于每组用例,输出该串中所有出现至少两次的子串个数
Sample Input
3
aabaab
aaaaa
AaAaA
Sample Output
5
4
5
Solution
每个height[i]就表示以sa[i-1]和sa[i]开始的后缀的公共前缀有height[i]个,而这height[i]个公共前缀就是在原串中至少出现两次的子串,考虑到有重复的情况,将height数组看作几个不减的序列组合而成,对于每组不减的序列,其对答案的贡献就是Max-Min,Max和Min分别为这组中height值的最大值和最小值
Code
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<map>using namespace std;#define maxn 111111int 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=0; int len=strlen(s); for(int i=0;i<len;i++)a[n++]=s[i]; a[n]=0; da(a,n,333); int ans=0,Min=0,Max=0; for(int i=2;i<=n;i++) { if(height[i]>Max) Max=height[i]; else { ans+=Max-Min; Min=Max=height[i]; } } ans+=Max-Min; printf("%d\n",ans); } return 0;}
0 0
- CSU 1632 Repeated Substrings(后缀数组)
- CSU 1632Repeated Substrings
- CSU1632: Repeated Substrings(后缀数组)
- UVALive 6869 Repeated Substrings(后缀数组)
- Substrings poj1226 (后缀数组)
- POJ-1226(后缀数组)(Substrings)
- POJ1226---Substrings(后缀数组+二分)
- spoj 694 Distinct Substrings(后缀数组)
- SPOJ 694 Distinct Substrings(后缀数组)
- Hdu 5769 Substrings (后缀数组)
- [SPOJ705]DISUBSTR - Distinct Substrings(后缀数组)
- [POJ1226]Substrings(后缀数组+二分)
- poj 1226 Substrings (后缀数组)
- POJ-1226 Substrings(后缀数组)
- poj3415Common Substrings(后缀数组+单调栈)
- SPOJ New Distinct Substrings(后缀数组)
- SPOJ DISUBSTR Distinct Substrings(后缀数组)
- poj1226 Substrings 后缀数组
- numpy上手笔记
- selenium 获取值的方法
- java面试常遇到的(2)
- TwinDB data recovery toolkit
- 得到指针指向的数组的长度
- CSU 1632 Repeated Substrings(后缀数组)
- 代码审计:审计思路之实例解说全文通读
- android color values
- NetWeaver ABAP Basis和J2EE提供的中间件服务的比较
- MySQL mysqldump数据导出详解
- Python中super关键字的作用
- C/C++混编之 extern "C"
- 移动医疗亟待落地,云计算厂商的新机遇?
- loadrunner 学习