1709. [SPOJ705]不同的子串

★★   输入文件:subst1.in   输出文件:subst1.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

给定一个字符串,计算其不同的子串个数。

【输入格式】

一行一个仅包含大写字母的字符串,长度<=50000

【输出格式】

一行一个正整数,即不同的子串个数。

【样例输入】

ABABA

【样例输出】

9

【来源】

SPOJ 705 New Distinct Substrings

#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+5;
int n,maxx,c[N],sa[N],tsa[N],rank[N],trank[N],h[N];
char s[N];long long ans;
void DA(){int p;maxx=256;memset(c,0,sizeof c);for(int i=1;i<=n;i++) c[rank[i]=s[i]]++;for(int i=2;i<=maxx;i++) c[i]+=c[i-1];for(int i=n;i;i--) sa[c[rank[i]]--]=i;trank[sa[1]]=p=1;for(int i=2;i<=n;i++){if(rank[sa[i]]!=rank[sa[i-1]]) p++;trank[sa[i]]=p;}for(int i=1;i<=n;i++) rank[i]=trank[i];for(int k=1;p<n;k<<=1,maxx=p){p=0;for(int i=n-k+1;i<=n;i++) tsa[++p]=i;for(int i=1;i<=n;i++) if(sa[i]>k) tsa[++p]=sa[i]-k;memset(c,0,sizeof c);for(int i=1;i<=n;i++) trank[i]=rank[tsa[i]];for(int i=1;i<=n;i++) c[trank[i]]++;for(int i=2;i<=maxx;i++) c[i]+=c[i-1];for(int i=n;i;i--) sa[c[trank[i]]--]=tsa[i];trank[sa[1]]=p=1;for(int i=2;i<=n;i++){if(rank[sa[i]]!=rank[sa[i-1]]||rank[sa[i]+k]!=rank[sa[i-1]+k]) p++;trank[sa[i]]=p;}for(int i=1;i<=n;i++) rank[i]=trank[i];}for(int i=1,k=0;i<=n;i++){int j=sa[rank[i]-1];while(s[i+k]==s[j+k]) k++;h[rank[i]]=k;if(k>0) k--;}
}
int main(){freopen("subst1.in","r",stdin);freopen("subst1.out","w",stdout);scanf("%s",s+1);n=strlen(s+1);DA();int ans=0;for(int i=1;i<=n;i++) ans+=(n-sa[i]+1-h[i]);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/shenben/p/6426618.html

[SPOJ705]不同的子串相关推荐

  1. SPOJ694 SPOJ705 ——不同子串的总数

    题意:给定字符串S,求S的不同子串的总数量. 求出SA数组与Height数组,每个子串必然是某个后缀的前缀.令S的长度为N,则后缀SA[i]可以贡献出N-SA[i]个前缀.但其中有Height[i]个 ...

  2. Redis 笔记(03)— string类型(设置key、获取key、设置过期时间、批量设置获取key、对key进行加减、对key值进行追加、获取value子串)

    字符串 string 是 Redis 最简单的数据结构.Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据.不同类型的数据结构的 ...

  3. 寻找一个字符串的重复子串 后缀数组

    什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...

  4. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法

    题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...

  5. 求一个字符串中连续出现的次数最多的子串

    求一个字符串中连续出现的次数最多的子串.例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复 ...

  6. 【牛客网】最长对称子串

    给定一个字符串(数字或大小写字母), 找出最长的对称的子串(如有多个,输出任意一个). 例如: 输入:"abbaad" 输出:"abba" #include & ...

  7. 【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)

    一.问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...

  8. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  9. BZOJ1396:识别子串(SAM)

    Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample I ...

最新文章

  1. 面试必问---Java线程池8大拒绝策略
  2. __bridge 使用注意
  3. Java_01_环境变量的配置
  4. 纯JS实现带小圆点缩略图及左右箭头的轮播图
  5. 思科模拟器32位_三款另类的68k Mac模拟器
  6. PEAR简介:用PEAR来写你的下一个php程序
  7. java集合类(简介)
  8. python一个星期可以入门吗_Python一星期入门第6篇: 模块和包
  9. 超酷jQuery进度条加载动画集合
  10. 问题二十五:为什么有时候XnView无法显示PPM图片?
  11. java中限制多人登录的_Spring Boot + Spring Security 防止用户在多处同时登录(一个用户同时只能登录一次)及源码分析...
  12. Android开发——常见的内存泄漏以及解决方案(二)
  13. 图文详解——将本地项目上传到码云(gitee)远程仓库
  14. Java编程:贪心算法
  15. js html方法的区别吗,jquery append()方法与html()方法的区别及使用介绍
  16. Python学习指南——1.常用库说明
  17. oracle数据库左链接,Oracle数据库中的左连接与右连接
  18. RapidMiner 数据读写
  19. java 读取文件内容 方法
  20. 华为网络设备查看电源状态检查命令

热门文章

  1. SAP MCH1表和MCHA表更新逻辑
  2. 从产品经理向人工智能产品经理进阶 | 机器学习必备知识
  3. 中国31个金融中心城市
  4. AI 重新定义金融,颠覆投资模式
  5. 机器学习的流程是怎样的呢?如何应用到实践中去呢?
  6. Python 越被黑越红?2 万程序员这么说......
  7. 干货丨机器学习指南(学习笔记哦,值得一看)
  8. 干货丨一份不可多得的深度学习技巧指南
  9. 《用Python进行自然语言处理》第8章 分析句子结构
  10. Centos7:update-initramfs -u:command not found