SPOJ SUBST1 New Distinct Substrings 后缀数组-子串个数
来源:互联网 发布:mac app store 很慢 编辑:程序博客网 时间:2024/05/04 20:08
#include<string.h>#include<algorithm>using namespace std;const int maxn=200000;int t1[maxn],t2[maxn],c[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 sa[],int rank1[],int height[],int n,int m){ n++; int i,j,p,*x=t1,*y=t2; //第一轮基数排序,如果s的最大值很大,可改为快速排序 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; //直接利用sa数组排序第二关键字 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; //这样数组y保存的就是按照第二关键字排序的结果 //基数排序第一关键字 for(i=0; i<m; i++) c[i]=0; //后面的j个数第二关键字为空的最小 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]; //根据sa和x数组计算新的x数组 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++) rank1[sa[i]]=i; for(i=0; i<n; i++) { if(k) k--; j=sa[rank1[i]-1]; while(str[i+k]==str[j+k]) k++; height[rank1[i]]=k; }}int rk[maxn],height[maxn],str[maxn],sa[maxn];char ss[maxn];int main(){ int i,m,n; scanf("%d",&m); while(m--) { scanf("%s",ss); n=strlen(ss); for(i=0;i<n;i++) str[i]=ss[i]; str[n]=0; da(str,sa,rk,height,n+1,128); int ans=0; for(i=0;i<n;i++) { //printf("%d %d\n",sa[i],height[i]); ans+=n-i-height[rk[i]]; } printf("%d\n",ans); } return 0;}
0 0
- SPOJ SUBST1 New Distinct Substrings 后缀数组-子串个数
- SPOJ SUBST1 - New Distinct Substrings(后缀数组[不相同的子串的个数])
- 【SPOJ-SUBST1】New Distinct Substrings【后缀数组】
- SPOJ - Distinct Substrings / SPOJ - New Distinct Substrings(后缀数组 - 不相同子串个数)
- SPOJ 705 SUBST1 New Distinct Substrings 后缀数组
- SPOJ SUBST1 New Distinct Substrings(后缀数组)
- SPOJ SUBST1 New Distinct Substrings(不同的子串个数)
- SPOJ 题目705 New Distinct Substrings(后缀数组,求不同的子串个数)
- SPOJ DISUBSTR Distinct Substrings 后缀数组子串个数
- SPOJ SUBST1 New Distinct Substrings
- SPOJ DISUBSTR - Distinct Substrings or SUBST1 - New Distinct Substrings 【不同子串数目】
- SPOJ 694 / SPOJ DISUBSTR Distinct Substrings【后缀数组】不相同的子串的个数
- spoj -705 New Distinct Substrings--后缀数组
- SPOJ 705 New Distinct Substrings (后缀数组)
- SPOJ 705 New Distinct Substrings 后缀数组
- SPOJ 705 New Distinct Substrings 后缀数组
- SPOJ New Distinct Substrings(后缀数组)
- SPOJ 694 Distinct Substrings + SPOJ 705 New Distinct Substrings (可重叠不相同子串个数)
- 密封类和密封方法
- brew快捷键
- online_judge_1019
- SPOJ DISUBSTR Distinct Substrings 后缀数组子串个数
- Android Studio NDK环境搭建与最简单例子编译执行
- SPOJ SUBST1 New Distinct Substrings 后缀数组-子串个数
- POJ 1661Help Jimmy(dp)
- strong 和 weak 指针
- Hibernate实验手册
- poj-3083-烦人复杂搜索+bfs,dfs模板
- MFC MDI 响应键盘事件
- JAVA中URL类的常用方法
- Atom设置震撼的编辑效果
- bzoj1208【HNOI2004】宠物收养所