博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SP694][SP705]DISUBSTR - Distinct Substrings/SUBST1 - New Distinct Substrings[SA]
阅读量:6290 次
发布时间:2019-06-22

本文共 1430 字,大约阅读时间需要 4 分钟。

\(\frac{n\times n+1}{2}\) 个子串,减去重复的(height 的 和)

1334706-20190327151947405-225291517.png

1334706-20190327152931434-895805389.png

1334706-20190327151957235-1298840720.png

“产生前缀” 的意思是 sa[i] 这个后缀有 n-sa[i]+1 个前缀

#include 
using namespace std;int k, n, rnk[50005], sa[50005], H[50005], c[50005], K;char s[50005];void Sort(int *x, int *y, int *rk) { static int C[50005]; for (int i = 0; i <= k; ++i) C[i] = 0; for (int i = 1; i <= n; ++i) ++C[rk[i]]; for (int i = 1; i <= k; ++i) C[i] += C[i - 1]; for (int i = n; i; --i) y[C[rk[x[i]]]--] = x[i];}inline bool cmp(int *y, int a, int b, int m) {return y[a] == y[b] && y[a + m] == y[b + m];}void get_SA() { static int Y[50005]; int *y = Y, *rk = rnk; for (int i = 1; i <= n; ++i) rk[i] = s[y[i] = i]; k = 128; Sort(y, sa, rk); for (int m = 1, p = 0; p < n; k = p, m <<= 1) { for (p = 0; p < m; ++p) y[p + 1] = n - m + p + 1; for (int i = 1; i <= n; ++i) if (sa[i] > m) y[++p] = sa[i] - m; Sort(y, sa, rk), swap(y, rk); rk[sa[p = 1]] = 1; for (int i = 2; i <= n; ++i) rk[sa[i]] = cmp(y, sa[i], sa[i - 1], m) ? p : ++p; } for (int i = 1; i <= n; ++i) rnk[sa[i]] = i;}void get_H() { for (int i = 1, k = 0; i <= n; H[rnk[i++]] = k) for (k ? --k : 0; s[i + k] == s[sa[rnk[i] - 1] + k]; ++k);}int main() { cin >> K; while (~scanf("%s", s + 1)) { n = strlen(s + 1); get_SA(); get_H(); unsigned int ans = n * 1ll * (n + 1) / 2; for (int i = 2; i <= n; ++i) ans -= H[i]; cout << ans << endl; } return 0;}

转载于:https://www.cnblogs.com/storz/p/10607795.html

你可能感兴趣的文章
sbin/hadoop-daemon.sh: line 165: /tmp/hadoop-hxsyl-journalnode.pid: Permission denied
查看>>
@RequestMapping 用法详解之地址映射
查看>>
254页PPT!这是一份写给NLP研究者的编程指南
查看>>
《Data Warehouse in Action》
查看>>
String 源码浅析(一)
查看>>
Spring Boot 最佳实践(三)模板引擎FreeMarker集成
查看>>
Fescar 发布 0.2.3 版本,支持 Redis 和 Apollo
查看>>
Google MapReduce到底解决什么问题?
查看>>
CCNP-6 OSPF试验2(BSCI)
查看>>
Excel 2013 全新的图表体验
查看>>
openstack 制作大于2TB根分区自动扩容的CENTOS镜像
查看>>
Unbuntu安装遭遇 vmware上的Easy install模式
查看>>
几个常用的ASP木马
查看>>
python分析postfix邮件日志的状态
查看>>
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>