给定一个字符串,求不相同的子串的个数。

假如给字符串“ABA";排列的子串可能:

A       B      A

AB       BA

ABA  

共3*(3+1)/2=6种;

后缀数组表示时:

A

ABA

BA

对于A和AB height[i]=1;

表明一个长度公共,所以ABA中多出现了A这个子串,所以6-1=5;

对于ABA BA height[i]=0,所以不需要减去。

最后答案为5;

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<string>
#include<map>
#define LL long long
using namespace std;
#define maxn 1100
int wa[maxn],wb[maxn],wv[maxn],WS[maxn];
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++) WS[i]=;
for(i=;i<n;i++) WS[x[i]=r[i]]++;
for(i=;i<m;i++) WS[i]+=WS[i-];
for(i=n-;i>=;i--) sa[--WS[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++) WS[i]=;
for(i=;i<n;i++) WS[wv[i]]++;
for(i=;i<m;i++) WS[i]+=WS[i-];
for(i=n-;i>=;i--) sa[--WS[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 Rank[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{
int i,j,k=;
for(i=;i<=n;i++) Rank[sa[i]]=i;
for(i=;i<n;height[Rank[i++]]=k)
for(k?k--:,j=sa[Rank[i]-];r[i+k]==r[j+k];k++);
return;
}
int r[maxn],sa[maxn];
char s[maxn];
void slove(int len)
{
int i,j,ans;
ans=(len+)*len/;//总共排列的个数
for(i=;i<=len;i++)
{
ans-=height[i];//相同的部分长度表示这段重复出现了。并且出现了height[i]个组合。
}
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>s;
int len=strlen(s);
for(int i=;i<len;i++)
r[i]=s[i];
r[len]=;
da(r,sa,len+,);
calheight(r,sa,len);
slove(len);
}
}

最新文章

  1. ActiveMQ简介
  2. [Effective JavaScript 笔记]第44条:使用null原型以防止原型污染
  3. 【Linux/Ubuntu学习 7】E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录
  4. the account is currently locked out. The system administrator can unlock it.
  5. 在ASP.NET MVC 中获取当前URL、controller、action(转)
  6. CSS案例
  7. Form标签+Css基础
  8. ES6 对let声明的一点思考
  9. Django完整的开发一个博客系统
  10. JAVA中正则表达式总结
  11. Auto Layout: Programmatic Constraints - BNR
  12. setoolkit 制作钓鱼网页
  13. cmd命令往MySQL数据库提交数据
  14. 创建免密码sudo用户
  15. docker容器中Postgresql 数据库备份
  16. [T-ARA][내가 너무 아파][我很痛]
  17. C语言版本:双链表的实现
  18. Java 笔记——在 IDEA 中使用 Maven 配置和使用 MyBatis
  19. Linux 根文件系统目录结构
  20. ios 安卓 video 取消播放自动全屏 属性

热门文章

  1. PLSQLDeveloper链接报错 解决办法
  2. storm-jdbc的使用
  3. LeetCode412Fizz Buzz
  4. Redis源码解析:13Redis中的事件驱动机制
  5. php工作中常用到的linux命令
  6. mac 安装svn
  7. 树形结构的数据渲染(element-ui&amp;VUE)
  8. 玩转gulp之压缩打包热重载
  9. 详谈Windows消息循环机制
  10. day38 08-Spring的id、name和scope顺序