SPOJ 694/705 后缀数组
思路:
论文题*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 后缀数组相关推荐
- SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和
SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和 Code: #include <cstdio> #include <algorithm> #include < ...
- POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...
- 后缀数组水水水水水水题
首先: jxrjxrjxr Orz,没有您我们都会死~ 然后就是我从jxr神犇那里借鉴(照抄)过来的后缀数组模板. #include<iostream> #include<cstdi ...
- |spoj 694|后缀数组|Distinct Substrings
spoj 694 给出一个字符串,求字符串中不相同的子串个数. 我们可以知道,字符串中的每个子串都是某个后缀的前缀,于是题目转化为求不相同的后缀的前缀问题.对于每一个SA[k]SA[k]开始的后缀,将 ...
- SPOJ 220 Relevant Phrases of Annihilation(后缀数组+二分答案)
[题目链接] http://www.spoj.pl/problems/PHRASES/ [题目大意] 求在每个字符串中出现至少两次的最长的子串 [题解] 注意到这么几个关键点:最长,至少两次,每个字符 ...
- SPOJ - PHRASES Relevant Phrases of Annihilation —— 后缀数组 出现于所有字符串中两次且不重叠的最长公共子串...
题目链接:https://vjudge.net/problem/SPOJ-PHRASES PHRASES - Relevant Phrases of Annihilation no tags You ...
- 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]
时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...
- hdu 2459 (后缀数组+RMQ)
题意:让你求一个串中连续重复次数最多的串(不重叠),如果重复的次数一样多的话就输出字典序小的那一串. 分析:有一道比这个简单一些的题spoj 687, 假设一个长度为l的子串重复出现两次,那么它必然会 ...
- 【后缀数组】伊芙利特之祭--总结
前几个月总结的后缀数组专题,现在贴出来吧. 不可重叠重复串; 可重叠k次重复串; 不相同子串个数 最长回文子串 连续重复子串 重复次数最多的连续重复子串 最长公共子串 长度不小于k 的公共子串的个 ...
最新文章
- LANMP框架搭建——源码编译
- 我是如何做到的:不切换 Git 分支,同时在多个分支上工作的?
- 测试软件Postman下载(亲测有效)
- vue created 调用方法_深入解析 Vue 的热更新原理,偷学尤大的秘籍?
- Apache ZooKeeper - ZK的基本特性与节点应用场景一览
- UI组件之AdapterView及其子类(四)Gallery画廊控件使用
- PAT1051 复数乘法 (15 分)
- Android Studio之编译t提示Invoke-customs are only supported starting with Android O (--min-api 26)
- mybatis_user_guide(3)XML配置
- NodeJS常用模块介绍
- PostgreSQL 视图、子查询
- 技术需求趋势报告:移动、社会化、电子商务最热
- (88)FPGA二分频设计,面试必问(十二)(第18天)
- python计算长方体体积编程_计算体积 编程创建一个Box类(长方体) 联合开发网 - pudn.com...
- opencv-api minEnclosingCircle
- html嵌入百度地图无法显示
- mac蓝牙鼠标总是自己断开_解决Mac蓝牙鼠标和键盘经常断开的问题
- OpenCV中的利用傅里叶梅林变换进行平移旋转图像的比对
- java 气象局api_国家气象局免费天气预报接口API
- JQuery实现复选框CheckBox的全选、反选、提交操作
热门文章
- 【计蒜客 - 2019南昌邀请赛网络赛 - K】MORE XOR(数学,找规律,打表)
- Coursera自动驾驶课程第3讲:Self-Driving Hardware and Software Architectures
- 4.深度学习练习:Building your Deep Neural Network: Step by Step(强烈推荐)
- * 构建一个list集合存储5个学生对象, 过滤年龄小于18的,存入一个新的map集合
- 在JSP页面中输出JSON格式数据
- 学习笔记18-C语言-文件
- android fragment动画,Fragment 的过场动画
- jpa java.util.map_使用JPA存储Map String,String
- C++(STL):25 ---序列式容器stack源码剖析
- Android在子线程里使用Toast报错Can't toast on a thread that has not called Looper.prepare()