[SPOJ705]不同的子串
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]不同的子串相关推荐
- SPOJ694 SPOJ705 ——不同子串的总数
题意:给定字符串S,求S的不同子串的总数量. 求出SA数组与Height数组,每个子串必然是某个后缀的前缀.令S的长度为N,则后缀SA[i]可以贡献出N-SA[i]个前缀.但其中有Height[i]个 ...
- Redis 笔记(03)— string类型(设置key、获取key、设置过期时间、批量设置获取key、对key进行加减、对key值进行追加、获取value子串)
字符串 string 是 Redis 最简单的数据结构.Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据.不同类型的数据结构的 ...
- 寻找一个字符串的重复子串 后缀数组
什么是后缀数组 令字符串 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 ...
- leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法
题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...
- 求一个字符串中连续出现的次数最多的子串
求一个字符串中连续出现的次数最多的子串.例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复 ...
- 【牛客网】最长对称子串
给定一个字符串(数字或大小写字母), 找出最长的对称的子串(如有多个,输出任意一个). 例如: 输入:"abbaad" 输出:"abba" #include & ...
- 【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)
一.问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...
- 【动态规划】最长公共子序列与最长公共子串
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- BZOJ1396:识别子串(SAM)
Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample I ...
最新文章
- 面试必问---Java线程池8大拒绝策略
- __bridge 使用注意
- Java_01_环境变量的配置
- 纯JS实现带小圆点缩略图及左右箭头的轮播图
- 思科模拟器32位_三款另类的68k Mac模拟器
- PEAR简介:用PEAR来写你的下一个php程序
- java集合类(简介)
- python一个星期可以入门吗_Python一星期入门第6篇: 模块和包
- 超酷jQuery进度条加载动画集合
- 问题二十五:为什么有时候XnView无法显示PPM图片?
- java中限制多人登录的_Spring Boot + Spring Security 防止用户在多处同时登录(一个用户同时只能登录一次)及源码分析...
- Android开发——常见的内存泄漏以及解决方案(二)
- 图文详解——将本地项目上传到码云(gitee)远程仓库
- Java编程:贪心算法
- js html方法的区别吗,jquery append()方法与html()方法的区别及使用介绍
- Python学习指南——1.常用库说明
- oracle数据库左链接,Oracle数据库中的左连接与右连接
- RapidMiner 数据读写
- java 读取文件内容 方法
- 华为网络设备查看电源状态检查命令
热门文章
- SAP MCH1表和MCHA表更新逻辑
- 从产品经理向人工智能产品经理进阶 | 机器学习必备知识
- 中国31个金融中心城市
- AI 重新定义金融,颠覆投资模式
- 机器学习的流程是怎样的呢?如何应用到实践中去呢?
- Python 越被黑越红?2 万程序员这么说......
- 干货丨机器学习指南(学习笔记哦,值得一看)
- 干货丨一份不可多得的深度学习技巧指南
- 《用Python进行自然语言处理》第8章 分析句子结构
- Centos7:update-initramfs -u:command not found