SPOJ 705 New Distinct Substrings (后缀数组)
来源:互联网 发布:匿名内部类java构造器 编辑:程序博客网 时间:2024/04/25 13:50
后缀数组模板题。由于height数组是指与排名上一个的公共前缀,所以重复的个数是height[i]个,考虑当前这个字母所构成的子串的贡献即为n-sa[i]-height[i],然后累加即可。
代码如下:
#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#include <string>#include <time.h>using namespace std;#define LL long long#define pi acos(-1.0)#pragma comment(linker, "/STACK:1024000000")const int mod=9901;const int INF=0x3f3f3f3f;const double eqs=1e-9;const int MAXN=50000+10;char st[MAXN];int wa[MAXN], wb[MAXN], wv[MAXN], ws1[MAXN], s[MAXN];int sa[MAXN], rk[MAXN], height[MAXN];int cmp(int *r, int a, int b, int l){ return r[a]==r[b]&&r[a+l]==r[b+l];}void getsa(int *r, int *sa, int n, int m){ int i, j, p, *x=wa, *y=wb, *t; for(i=0;i<m;i++) ws1[i]=0; for(i=0;i<n;i++) ws1[x[i]=r[i]]++; for(i=1;i<m;i++) ws1[i]+=ws1[i-1]; for(i=n-1;i>=0;i--) sa[--ws1[x[i]]]=i; for(j=1,p=1;p<n;j*=2,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++) ws1[i]=0; for(i=0;i<n;i++) ws1[wv[i]]++; for(i=1;i<m;i++) ws1[i]+=ws1[i-1]; for(i=n-1;i>=0;i--) sa[--ws1[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++; }}void Calheight(int *r, int n){ int i, j, k=0; for(i=1;i<=n;i++) rk[sa[i]]=i; for(i=0;i<n;height[rk[i++]]=k){ for(k?--k:0,j=sa[rk[i]-1];r[i+k]==r[j+k];k++) ; }}int main(){ int t, n, i; LL ans; scanf("%d",&t); while(t--){ scanf("%s",st); n=strlen(st); for(i=0;i<n;i++){ s[i]=st[i]; } s[n]=0; getsa(s,sa,n+1,128); Calheight(s,n); ans=0; for(i=1;i<=n;i++){ ans+=n-sa[i]-height[i]; } printf("%lld\n",ans); } return 0;}
1 0
- spoj -705 New Distinct Substrings--后缀数组
- SPOJ 705 New Distinct Substrings (后缀数组)
- SPOJ 705 New Distinct Substrings 后缀数组
- SPOJ 705 New Distinct Substrings 后缀数组
- 【SPOJ-SUBST1】New Distinct Substrings【后缀数组】
- SPOJ New Distinct Substrings(后缀数组)
- SPOJ 694. Distinct Substrings,705. New Distinct Substrings(后缀数组)
- SPOJ 705 SUBST1 New Distinct Substrings 后缀数组
- SPOJ 694、705 Distinct Substrings 、 New Distinct Substrings (后缀数组)
- SPOJ Distinct Substrings 后缀数组
- SPOJ - Distinct Substrings / SPOJ - New Distinct Substrings(后缀数组 - 不相同子串个数)
- SPOJ SUBST1 New Distinct Substrings 后缀数组-子串个数
- SPOJ SUBST1 New Distinct Substrings(后缀数组)
- SPOJ 题目705 New Distinct Substrings(后缀数组,求不同的子串个数)
- SPOJ 705 New Distinct Substrings
- [SPOJ 705] New Distinct Substrings
- spoj 694. Distinct Substrings(后缀数组)
- SPOJ 694 Distinct Substrings(后缀数组)
- OC 学习第六天_Block的使用
- 接口和抽象类的区别
- Linux 中mdelay() 与msleep()的区别
- 了解blocks基本语法
- 小问题的解决,小进步
- SPOJ 705 New Distinct Substrings (后缀数组)
- #1116 : 计算
- VC C/C++ 函数调用约定
- ios 上传单张图片到服务器
- iOS 框架和服务
- Effective C++(五)
- ssoj2472遇险
- android开源项目和框架
- UVa 12112 - Iceman