思路:
论文题*n
Σn-i-ht[i]+1 就是结果 O(n)搞定~

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 55555
int cases,n,cntA[N],cntB[N],A[N],B[N],rk[N],sa[N],tsa[N],ht[N];
char s[N];
void SA(){memset(cntA,0,sizeof(cntA));for(int i=1;i<=n;i++)cntA[s[i]]++;for(int i=1;i<=256;i++)cntA[i]+=cntA[i-1];for(int i=n;i;i--)sa[cntA[s[i]]--]=i;rk[sa[1]]=1;for(int i=2;i<=n;i++)rk[sa[i]]=rk[sa[i-1]]+(s[sa[i]]!=s[sa[i-1]]);for(int l=1;rk[sa[n]]<n;l<<=1){memset(cntA,0,sizeof(cntA));memset(cntB,0,sizeof(cntB));for(int i=1;i<=n;i++)cntA[A[i]=rk[i]]++,cntB[B[i]=i+l<=n?rk[i+l]:0]++;for(int i=1;i<=n;i++)cntA[i]+=cntA[i-1],cntB[i]+=cntB[i-1];for(int i=n;i;i--)tsa[cntB[B[i]]--]=i;for(int i=n;i;i--)sa[cntA[A[tsa[i]]]--]=tsa[i];rk[sa[1]]=1;for(int i=2;i<=n;i++)rk[sa[i]]=rk[sa[i-1]]+(A[sa[i]]!=A[sa[i-1]]||B[sa[i]]!=B[sa[i-1]]);}for(int i=1,j=0;i<=n;i++){j=j?j-1:0;while(s[i+j]==s[sa[rk[i]-1]+j])j++;ht[rk[i]]=j;}
}
int main(){scanf("%d",&cases);while(cases--){long long ans=0;scanf("%s",s+1),n=strlen(s+1),SA();for(int i=1;i<=n;i++)ans+=n-i-ht[i]+1;printf("%lld\n",ans);}
}

转载于:https://www.cnblogs.com/SiriusRen/p/6532077.html

SPOJ 694/705 后缀数组相关推荐

  1. SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和

    SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和 Code: #include <cstdio> #include <algorithm> #include < ...

  2. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

  3. 后缀数组水水水水水水题

    首先: jxrjxrjxr Orz,没有您我们都会死~ 然后就是我从jxr神犇那里借鉴(照抄)过来的后缀数组模板. #include<iostream> #include<cstdi ...

  4. |spoj 694|后缀数组|Distinct Substrings

    spoj 694 给出一个字符串,求字符串中不相同的子串个数. 我们可以知道,字符串中的每个子串都是某个后缀的前缀,于是题目转化为求不相同的后缀的前缀问题.对于每一个SA[k]SA[k]开始的后缀,将 ...

  5. SPOJ 220 Relevant Phrases of Annihilation(后缀数组+二分答案)

    [题目链接] http://www.spoj.pl/problems/PHRASES/ [题目大意] 求在每个字符串中出现至少两次的最长的子串 [题解] 注意到这么几个关键点:最长,至少两次,每个字符 ...

  6. SPOJ - PHRASES Relevant Phrases of Annihilation —— 后缀数组 出现于所有字符串中两次且不重叠的最长公共子串...

    题目链接:https://vjudge.net/problem/SPOJ-PHRASES PHRASES - Relevant Phrases of Annihilation no tags  You ...

  7. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]

    时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...

  8. hdu 2459 (后缀数组+RMQ)

    题意:让你求一个串中连续重复次数最多的串(不重叠),如果重复的次数一样多的话就输出字典序小的那一串. 分析:有一道比这个简单一些的题spoj 687, 假设一个长度为l的子串重复出现两次,那么它必然会 ...

  9. 【后缀数组】伊芙利特之祭--总结

      前几个月总结的后缀数组专题,现在贴出来吧. 不可重叠重复串; 可重叠k次重复串; 不相同子串个数 最长回文子串 连续重复子串 重复次数最多的连续重复子串 最长公共子串 长度不小于k 的公共子串的个 ...

最新文章

  1. LANMP框架搭建——源码编译
  2. 我是如何做到的:不切换 Git 分支,同时在多个分支上工作的?
  3. 测试软件Postman下载(亲测有效)
  4. vue created 调用方法_深入解析 Vue 的热更新原理,偷学尤大的秘籍?
  5. Apache ZooKeeper - ZK的基本特性与节点应用场景一览
  6. UI组件之AdapterView及其子类(四)Gallery画廊控件使用
  7. PAT1051 复数乘法 (15 分)
  8. Android Studio之编译t提示Invoke-customs are only supported starting with Android O (--min-api 26)
  9. mybatis_user_guide(3)XML配置
  10. NodeJS常用模块介绍
  11. PostgreSQL 视图、子查询
  12. 技术需求趋势报告:移动、社会化、电子商务最热
  13. (88)FPGA二分频设计,面试必问(十二)(第18天)
  14. python计算长方体体积编程_计算体积 编程创建一个Box类(长方体) 联合开发网 - pudn.com...
  15. opencv-api minEnclosingCircle
  16. html嵌入百度地图无法显示
  17. mac蓝牙鼠标总是自己断开_解决Mac蓝牙鼠标和键盘经常断开的问题
  18. OpenCV中的利用傅里叶梅林变换进行平移旋转图像的比对
  19. java 气象局api_国家气象局免费天气预报接口API
  20. JQuery实现复选框CheckBox的全选、反选、提交操作

热门文章

  1. 【计蒜客 - 2019南昌邀请赛网络赛 - K】MORE XOR(数学,找规律,打表)
  2. Coursera自动驾驶课程第3讲:Self-Driving Hardware and Software Architectures
  3. 4.深度学习练习:Building your Deep Neural Network: Step by Step(强烈推荐)
  4. * 构建一个list集合存储5个学生对象, 过滤年龄小于18的,存入一个新的map集合
  5. 在JSP页面中输出JSON格式数据
  6. 学习笔记18-C语言-文件
  7. android fragment动画,Fragment 的过场动画
  8. jpa java.util.map_使用JPA存储Map String,String
  9. C++(STL):25 ---序列式容器stack源码剖析
  10. Android在子线程里使用Toast报错Can't toast on a thread that has not called Looper.prepare()