首先,我们来定义一下淋漓尽致子串。

1.令原串为S。
2.设子串的长度为len,在原串S中出现的次数为k,令其出现的位置为p1, p2, ....pk(即这个子串在原串中[pi,pi + len - 1]中出现)。

3.若k=1,则该子串不是淋漓尽致子串。
4.若存在pi,pj(i != j),使得S[pi - 1] = S[pj - 1],则该子串不是淋漓尽致子串。
5.若存在pi,pj(i != j),使得S[pi + len] = S[pj + len],则该字串不是淋漓尽致字串。
否则,该子串为淋漓尽致子串。
我想知道这个串有多少个本质不同的淋漓尽致子串。
数据范围:
|S| <= 100000

S由小写字母组成。
考虑用SAM,来分析一下题目中的条件
首先出现超过一次,即sz[i]>1
条件4,即满足在parent树上,没有一个i的儿子j满足sz[j]>1
条件5,满足在转移DAG上,没有一个儿子j满足sz[j]>1
于是每找到一个节点,就会为答案贡献1
#pragma GCC opitmize("O3")
#pragma G++ opitmize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 200010
using namespace std;
char str[N]; int ans=0;
int s[N][26],mx[N],sz[N],f[N];
int n,m,cnt=1,lst=1,v[N],r[N];
inline int extend(int c){int p=lst,np=lst=++cnt,q,nq;mx[np]=mx[p]+1; sz[np]=1;for(;!s[p][c];p=f[p]) s[p][c]=np;if(!p) return f[np]=1;q=s[p][c];if(mx[q]==mx[p]+1) f[np]=q;else{nq=++cnt;mx[nq]=mx[p]+1;f[nq]=f[q]; f[q]=f[np]=nq;memcpy(s[nq],s[q],26<<2);for(;p&&s[p][c]==q;p=f[p]) s[p][c]=nq;}
}
int main(){scanf("%s",str+1); n=strlen(str+1);for(int i=1;i<=n;++i) extend(str[i]-'a');for(int i=1;i<=cnt;++i) ++v[mx[i]];for(int i=1;i<=n;++i) v[i]+=v[i-1];for(int i=cnt;i;--i) r[v[mx[i]]--]=i;for(int i=cnt;i;--i) sz[f[r[i]]]+=sz[r[i]];memset(v,*sz=0,sizeof v);for(int p,i=cnt;i;--i){p=r[i];if(sz[p]>1) v[f[p]]=1;if(sz[p]==1) v[p]=1; else for(int c=0;c<26;++c)if(sz[s[p][c]]>1){ v[p]=1; break; }}for(int i=cnt;i;--i) ans+=!v[i];printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/Extended-Ash/p/9477134.html

51Nod1469 淋漓尽致子串相关推荐

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

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

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

    什么是后缀数组 令字符串 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 ...

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

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

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

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

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

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

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

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

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

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

  8. BZOJ1396:识别子串(SAM)

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

  9. SPOJ 694 不同子串个数

    一个论文题,求一个字符串有多少个不同的子串. 每个字符串可以看做一个后缀的前缀,然后,就转换为求每一个后缀中,不同的子串有多少. 每一个后缀,根据长度,可以提供len - sa[i] 个子串,但是,画 ...

最新文章

  1. linux 文件查找与文件中注释去除
  2. Android文件的下载
  3. js超出文字个数展示省略号
  4. 使用 vue-cli 开发多页应用
  5. 读完《云原生架构白皮书》,我们来谈谈开放应用模型(OAM)
  6. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)...
  7. HTTP之Range
  8. map、mapPartitions、mapValues、mapWith、flatMap、flatMapWith、flatMapValues
  9. Mybatis教程(实战看这一篇就够了)
  10. 西南科技大学OJ题 Delete Numbers 0700
  11. ROS下使用摄像头进行机器人巡线功能(附带功能包链接)
  12. mysql闪退的解决方案
  13. Netbean8.2初次运行Mavn的初始配置
  14. PeopleSoft基础知识整理
  15. 【SPEA】T100BT 全能型电池测试仪——精度高、智能化
  16. 老师计算机组合照说说,关于老师的空间说说23句
  17. 跨链技术如何破解区块链的可扩展性难题?
  18. 快速排序的三种方式以及快排的优化
  19. oracle ora-03114
  20. C++ 策略模式的具体案例与优缺点

热门文章

  1. 005 vim程序编辑器
  2. [Postgres]Postgres复制表
  3. old header
  4. Linux CentOS 5.5 服务器安装图文教程
  5. Iframe的那些事
  6. node --- [跨域] 预检请求
  7. ES5 every/some/reduce/reduceRight的使用与重写
  8. 页面中切换echarts主题
  9. 零基础学python,看完这篇文章,你的python基础就差不多了!干货【1】
  10. Linux 文件系统 EXT4 的前世今生