个人第一道后缀数组题目。
对于每一个后缀suffix(i),都有len-sa[i]个前缀(也即有len-sa[i]个不同的字符串),其中与排名前一位的后缀有height[i]个共同的前缀,最后所得到的新的字符串个数为len-sa[i]-height[i].因此这题只要求出sa以及height即可求得答案。

#include<stdio.h>
#include<string.h>
#define maxn 100010
int wa[maxn];
int wb[maxn];
int wv[maxn];
int wsa[maxn];
int ranks[maxn],height[maxn]; void calheight(int *r,int *sa,int n)
{
int i,j,k=;
for(i=;i<=n;i++) ranks[sa[i]]=i;
for(i=;i<n ;height[ranks[i++]]=k)
for(k?k--:,j=sa[ranks[i]-];r[i+k]==r[j+k];k++);
return;
} int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}; void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=;i<m;i++) wsa[i]=;
for(i=;i<n;i++) wsa[x[i]=r[i]]++;
for(i=;i<m;i++) wsa[i]+=wsa[i-];
for(i=n-;i>=;i--) sa[--wsa[x[i]]]=i;
for(j=,p=;p<n;j*=,m=p)
{
for(p=,i=n-j;i<n;i++) y[p++]=i;
for(i=;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=;i<n;i++) wv[i]=x[y[i]];
for(i=;i<m;i++) wsa[i]=;
for(i=;i<n;i++) wsa[wv[i]]++;
for(i=;i<m;i++) wsa[i]+=wsa[i-];
for(i=n-;i>=;i--) sa[--wsa[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
return;
} int r[maxn];
int sa[maxn];
int main()
{
char str[maxn];
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
memset(r, ,sizeof(r));
memset(sa, , sizeof(sa));
int len = strlen(str);
for (i = ; i < len; ++i)
{
r[i] = (int)str[i];
}
da(r, sa, len + , );
calheight(r, sa, len);
int sum = ;
for(i=;i<len;i++)
sum += len-sa[i+]-height[i+];
printf("%d\n",sum);
}
return ;
}

最新文章

  1. 面试准备 - 最大堆的Csharp实现
  2. IOS-多线程技术
  3. iOS解析Server端返回JSON数据
  4. Android项目实战(十四):TextView显示html样式的文字
  5. CGI(通用网关接口)
  6. XSS Filter Evasion Cheat Sheet 中文版
  7. LA 3644 X-Plosives
  8. 很全的corel图像分类,场景识别图像库
  9. iOS开发——锁屏监听
  10. [BZOJ 2127] happiness 【最小割】
  11. mac下搭建cordova开发环境
  12. ArcEngine 关于缩放至一定比例显示地图的问题
  13. C-图文上边对齐
  14. python入门学习:5.字典
  15. BZOJ2229[Zjoi2011]最小割——最小割树
  16. LeetCode(485. 最大连续1的个数)
  17. [HDU3436]Queue-jumpers
  18. U3d 注意
  19. stats.js随时查看fps
  20. 非常简单的vue里面引入jquery

热门文章

  1. 10 从DFS到DFT
  2. MVC 拦截器
  3. day5-1继承
  4. static的特性
  5. Duilib 修改程序exe、在任务栏以及任务管理器上的图标
  6. httpclient post 请求
  7. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验
  8. ubuntu18.04下安装node
  9. 关于length、length()、size()
  10. 吴裕雄--天生自然HADOOP学习笔记:hadoop集群实现PageRank算法实验报告