评测地址:https://cn.vjudge.net/problem/CSU-1632

Description

求字符串中所有出现至少2次的子串个数

Input

第一行为一整数T(T<=10)表示用例组数,每组用例占一行为一个长度不超过100000的字符串

Output

对于每组用例,输出该串中所有出现至少两次的子串个数

Sample Input

3

aabaab

aaaaa

AaAaA

Sample Output

5

4

5

Solution

Ans=sum(max(height(i)-height(i-1),0))

#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+;
int T,n,ans,c[N],sa[N],tsa[N],trank[N],rank[N],h[N];
char s[N];
void DA(int maxx=){
memset(c,,sizeof c);int p;
for(int i=;i<=n;i++) c[rank[i]=s[i]]++;
for(int i=;i<=maxx;i++) c[i]+=c[i-];
for(int i=n;i;i--) sa[c[rank[i]]--]=i;
trank[sa[]]=p=;
for(int i=;i<=n;i++){
if(rank[sa[i]]!=rank[sa[i-]]) p++;
trank[sa[i]]=p;
}
for(int i=;i<=n;i++) rank[i]=trank[i];
for(int k=;p<n;k<<=,maxx=p){
p=;
for(int i=n-k+;i<=n;i++) tsa[++p]=i;
for(int i=;i<=n;i++) if(sa[i]>k) tsa[++p]=sa[i]-k;
memset(c,,sizeof c);
for(int i=;i<=n;i++) trank[i]=rank[tsa[i]];
for(int i=;i<=n;i++) c[trank[i]]++;
for(int i=;i<=maxx;i++) c[i]+=c[i-];
for(int i=n;i;i--) sa[c[trank[i]]--]=tsa[i];
trank[sa[]]=p=;
for(int i=;i<=n;i++){
if(rank[sa[i]]!=rank[sa[i-]]||rank[sa[i]+k]!=rank[sa[i-]+k]) p++;
trank[sa[i]]=p;
}
for(int i=;i<=n;i++) rank[i]=trank[i];
}
for(int i=,k=;i<=n;i++){
int j=sa[rank[i]-];
while(s[i+k]==s[j+k]) k++;
h[rank[i]]=k;if(k>)k--;
}
}
void GO(){
ans=;
for(int i=;i<=n;i++) if(h[i]>h[i-]) ans+=h[i]-h[i-];
printf("%d\n",ans);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%s",s+);n=strlen(s+);
DA();
GO();
}
return ;
}

最新文章

  1. 【完整靠谱版】结合公司项目,仔细总结自己使用百度编辑器实现FTP上传的完整过程
  2. eclipse左侧不见
  3. oracle 11g dmp文件导入10g
  4. 个人制作-css+html旋转立方体的制作
  5. tornado 反向代理后 获取真实客户端IP
  6. C++ --- Hellowrod
  7. 【Agorithm】一次一密加密解密算法
  8. Gym 100463D Evil DFS
  9. 哈哈,好像swift 以后有可能用来开发安卓喔
  10. 关于两个php.ini的说明
  11. Java拾穗
  12. Quartz.net一个简要示例
  13. SaaS应用“正益工作”发布,为大中型企业轻松构建移动门户
  14. Android 之 资源文件的介绍及使用
  15. Android学习笔记——Activity的启动和创建
  16. Domain=com.alamofire.error.serialization.response Code=-1016 &quot;Request failed: unacceptable content-type: text/html&quot;
  17. 【BZOJ1500】【Noi2005】维修数列
  18. Android简易实战教程--第二十四话《画画板》
  19. mysql关联表更改表多个字段值
  20. AngularJS学习之旅—AngularJS 模块(十五)

热门文章

  1. UGUI 实现界面 渐隐渐现 FadeIn/Out 效果
  2. windows 7 提示升级到windows 10补丁
  3. What most young programmers need to learn
  4. atitit.MyEclipse10 中添加svn插件故障排除
  5. URL中的#号
  6. Android学习笔记(一)——Activity简介 和 View
  7. node-webkit中使用sqlite3
  8. Silverlight实例教程 - Validation数据验证DataAnnotation机制和调试技巧(转载)
  9. FPGA研发之道(25)-管脚
  10. objc_setAssociatedObject 使用(转)