SPOJ SUBST1 New Distinct Substrings
来源:互联网 发布:封闭式小区 知乎 编辑:程序博客网 时间:2024/05/18 20:49
SUBST1 - New Distinct Substrings
Given 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 <= 50000
Output
For each test case output one number saying the number of distinct substrings.
Example
Input:2CCCCCABABAOutput:59
后缀数组模板题
#include <stdio.h>#include <string.h>const int MAXN=50005;int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN],rank[MAXN],height[MAXN], r[MAXN],sa[MAXN];char s[MAXN];int cmp(int *r,int a,int b,int l){ if(r[a]==r[b]&&r[a+l]==r[b+l]) return 1; return 0;}void da(int *r,int *sa,int n,int m){ int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) ws[i]=0; for(i=0;i<n;i++) ws[x[i]=r[i]]++; for(i=1;i<m;i++) ws[i]+=ws[i-1]; for(i=n-1;i>=0;i--) sa[--ws[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++) ws[i]=0; for(i=0;i<n;i++) ws[wv[i]]++; for(i=1;i<m;i++) ws[i]+=ws[i-1]; for(i=n-1;i>=0;i--) sa[--ws[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++; } return;}void calheight(int *r,int *sa,int n){ int i,j,k=0; for(i=1;i<=n;i++) rank[sa[i]]=i; for(i=0;i<n;height[rank[i++]]=k) for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); return;}int main(){ int i,n,t; long long ans; scanf("%d",&t); while(t-->0) { scanf("%s",s); n=strlen(s); for(i=0;i<n;i++) r[i]=s[i]; r[n]=0; da(r,sa,n+1,128); calheight(r,sa,n); ans=(long long)n*(n+1)/2; for(i=1;i<=n;i++) ans-=height[i]; printf("%lld\n",ans); } return 0;}
0 0
- SPOJ SUBST1 New Distinct Substrings
- 【SPOJ-SUBST1】New Distinct Substrings【后缀数组】
- SPOJ 705 SUBST1 New Distinct Substrings 后缀数组
- SPOJ SUBST1 New Distinct Substrings 后缀数组-子串个数
- SPOJ SUBST1 New Distinct Substrings(后缀数组)
- SPOJ DISUBSTR - Distinct Substrings or SUBST1 - New 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 705 New Distinct Substrings
- SPOJ 694. Distinct Substrings,705. New Distinct Substrings(后缀数组)
- spoj 694 705. New Distinct Substrings
- spoj -705 New Distinct Substrings--后缀数组
- SPOJ 705 New Distinct Substrings (后缀数组)
- SPOJ 705 New Distinct Substrings 后缀数组
- 如何优化cocos2d程序的内存使用和程序大小:第一部分
- 结构体和NSValue的转换
- Data Binding & Espresso: IllegalAccessError: Class ref in pre-verified class resolved to unexpected
- 关于dialog出现not attached to window manager问题深入分析
- VideoView小试牛刀
- SPOJ SUBST1 New Distinct Substrings
- Lua 在C程序中调用Lua函数
- oracle分组函数
- HttpClient 4.3教程
- intellj 创建Servlet小程序
- Swift函数
- netcat简易版 加 tcp代理!
- 基础算法----快速排序
- Android开发使用的常见第三方框架