传送门

文章目录

  • 题意:
  • 思路:

题意:

求sss中本质不同的字串个数。

1≤∣s∣≤1e51\le |s|\le 1e51≤∣s∣≤1e5

思路:

显然, 个数就是∑(len[i]−len[fa[i]])\sum (len[i]-len[fa[i]])∑(len[i]−len[fa[i]])。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=2000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int last=1,tot=1,len;
int cnt[N];
char s[N];
struct Node {int ch[26];int len,fa;
}sam[N*2];
vector<int>v[N];void add(int c) {int p=last,np=last=++tot; cnt[tot]=1;sam[np].len=sam[p].len+1;while(p&&!sam[p].ch[c]) {sam[p].ch[c]=np;p=sam[p].fa;} if(!p) sam[np].fa=1;else {int q=sam[p].ch[c];if(sam[q].len==sam[p].len+1) sam[np].fa=q;else {int nq=++tot; sam[nq]=sam[q];sam[nq].len=sam[p].len+1;sam[q].fa=sam[np].fa=nq;while(p&&sam[p].ch[c]==q) {sam[p].ch[c]=nq;p=sam[p].fa;}}}
}LL ans=0;int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int n;scanf("%d%s",&n,s+1);int len=strlen(s+1);for(int i=1;i<=len;i++) add(s[i]-'a');for(int i=2;i<=tot;i++) ans+=sam[i].len-sam[sam[i].fa].len;cout<<ans<<endl;return 0;
}
/**/```cpp
// Problem: P2408 不同子串个数
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2408
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int last=1,tot=1,len;
int cnt[N],n;
char s[N];
LL ans[N];
struct Node {int ch[26];int len,fa;
}sam[N*2];void add(int c) {int p=last,np=last=++tot; sam[np].len=sam[p].len+1;while(p&&!sam[p].ch[c]) {sam[p].ch[c]=np;p=sam[p].fa;}if(!p) sam[np].fa=1;else {int q=sam[p].ch[c];if(sam[p].len+1==sam[q].len) sam[np].fa=q;else {int nq=++tot;sam[nq]=sam[q];sam[nq].len=sam[p].len+1;sam[q].fa=sam[np].fa=nq;while(p&&sam[p].ch[c]==q) {sam[p].ch[c]=nq;p=sam[p].fa;}}}
}LL dfs(int u) {if(ans[u]) return ans[u];for(int i=0;i<26;i++) if(sam[u].ch[i]) dfs(sam[u].ch[i]),ans[u]+=ans[sam[u].ch[i]]+1;return ans[u];
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%s",&n,s+1);for(int i=1;i<=n;i++) add(s[i]-'a');printf("%lld\n",dfs(1));return 0;
}
/**/

P2408 不同子串个数 SAM相关推荐

  1. P2408 不同子串个数

    P2408 不同子串个数 题意: 给你一个长为 n 的字符串,求不同的子串的个数. 我们定义两个子串不同,当且仅当有这两个子串长度不一样或者长度一样且有任意一位不一样. 子串的定义:原字符串中连续的一 ...

  2. 洛谷 - P6292 区间本质不同子串个数(SAM+LCT+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的字符串,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 内有多少个本质不同的字符串 题目分析:首先简化模型,回顾一下如何求解 &quo ...

  3. 洛谷 P2408 不同子串个数 题解

    一道很好的后缀数组和后缀自动机的练习题.本题解分成两个部分,分别讲解用后缀数组做和用后缀自动机做. 1 1 1.后缀数组 我们知道,后缀数组中的 h e i g h t height height 数 ...

  4. hdu5056(找相同字母不出现k次的子串个数)

    题意:      给你一个字符串,然后问你这个字符串里面有多少个满足要求的子串,要求是每个子串相同字母出现的次数不能超过k. 思路:      这种题目做着比较有意思,而且不是很难(但自己还是嘚瑟,w ...

  5. HDU 3948 不同回文子串个数

    集训队论文中有求不同子串个数的做法,就是扫一遍height数组,过程中根据height数组进行去重.对于本题也是雷同的,只是每一次不是根据与排名在上一位的LCP去重,而是与上一次统计对答案有贡献的后缀 ...

  6. [SDOI2016] 生成魔咒(后缀数组SA + st表 + set)动态不同子串个数

    problem luogu-P4070 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1,21,21,2 拼凑起来形成一个魔咒串 [1,2][1,2][1,2]. 一个魔咒串 ...

  7. 【蓝桥杯】算法提高 着急的WYF(不同子串个数)

    算法提高 着急的WYF 问题描述 WYF在战网上的密码非常复杂(含大小写字母.数字以及特殊字符,如"!","@","{"等),但他很不巧地忘 ...

  8. 蓝桥杯 ADV-343 着急的WYF(不同子串个数)

    试题 算法提高 着急的WYF(不同子串个数) 资源限制 时间限制:476ms 内存限制:256.0MB 问题描述 由于战网的密码是一串乱码,WYF巧妙地忘记了他的密码.(他就是作死,如同自掘坟墓.说到 ...

  9. 字符串:字符串顺序比较、11-2删除重复元素、字符串生成器、着急的WYF(不同子串个数)

    字符串顺序比较 问题描述比较两个字符串s1和s2,输出:0表示s1与s2相等:1表示s1的字母序先于s2:-1表示s1的字母序后于s2输入格式输入两行,第一行输入一个字符串1,第二行输入字符串2.输出 ...

最新文章

  1. ubuntu 12.04/11.10 PPA 安装 Nvidia 295.59
  2. Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数
  3. Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap
  4. P2633 Count on a tree
  5. linux历史性能数据,Linux平台下如何看OS历史的性能数据
  6. C++:程序运行崩溃后生成dump文件
  7. java的Apollo的功能_Apollo配置中心
  8. 接收诊断响应的相关CAPL函数,具有较高的可复用性
  9. visio 2016插入origin 2020 导出的图片是黑色
  10. ubuntu20.04安装有道词典
  11. Python与Anaconda、Jupyter Notebook与Pycharm
  12. 深度学习自然语言处理模型实现大集合(精简版<100行)
  13. 尚硅谷maven视频教程笔记
  14. 计算机三级网络技术知识点大全(七)
  15. 526. 优美的排列
  16. HTML静态网页作业——我的家乡安庆
  17. python 读取pdf cid_记一次为解决Python读取PDF文件的Shell操作
  18. html按钮按下效果_如何用HTML实现简单按钮样式
  19. 微信小程序上传多张图片,上传文件pdf等
  20. 面试HR必谈问题合集

热门文章

  1. php保存附件到指定服务器,如何在PHP中将电子邮件附件保存到服务器?
  2. 史上超强的学科碰撞,有生之年必看系列!
  3. 自从我上了数据结构课之后……
  4. rocketmq 顺序消费_10 分钟看懂消息队列 RocketMQ
  5. c语言字符比较思路,C语言讲解思路资料
  6. 数据集转换_为什么LSTM看起来那么复杂,以及如何避免时序数据的处理差异和混乱...
  7. python二维列表写入excel_用Python实现合并excel列表
  8. 单调谐回路谐振放大器等效电路分析_手把手教你如何分析三极管电路
  9. mysql使用索引下推的好处_mysql的索引下推理解和实践
  10. 生成drl文件_我如何通过编程方式生成.drl文件。任何示例对我都将有所帮助