题目大意:有一个字符串,每次在末尾加入一个字符,问当前共有多少个本质不同的字串

题解:$SAM$,就是问插入这个字符后,多了多少个字串,就是当前这个点的$Right$数组大小。

卡点:

C++ Code:

#include <cstdio>
#include <iostream>
#include <map>
#define maxn 100010
long long ans;
namespace SAM {
#define N (maxn << 1)
#define root 1
int R[N], fail[N];
std::map<int, int> nxt[N];
int lst = root, idx = root;
void append(int ch) {
int p = lst, np = lst = ++idx;
R[np] = R[p] + 1;
for (; p && !nxt[p].count(ch); p = fail[p]) nxt[p][ch] = np;
if (!p) fail[np] = root;
else {
int q = nxt[p][ch];
if (R[p] + 1 == R[q]) fail[np] = q;
else {
int nq = ++idx;
nxt[nq] = nxt[q], fail[nq] = fail[q], R[nq] = R[p] + 1, fail[np] = fail[q] = nq;
for (; p && nxt[p].count(ch) && nxt[p][ch] == q; p = fail[p]) nxt[p][ch] = nq;
}
}
}
int query() {
return R[lst] - R[fail[lst]];
}
#undef root
#undef N
} int n;
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n;
for (int i = 0, x; i < n; i++) {
std::cin >> x;
SAM::append(x);
std::cout << (ans += SAM::query()) << '\n';
}
return 0;
}

  

最新文章

  1. 安装和使用cocoapods
  2. Android Broadcast 和 iOS Notification
  3. js不间断平滑地自动向上滚动
  4. C# (事件触发)回调函数,完美处理各类疑难杂症!
  5. 在shell脚本中使用函数
  6. java学习第八天
  7. Yeoman+Express+Angular在Linux上开发配置方法
  8. vaddin使用技巧
  9. Tomcat使用startup启动,一闪而过,如何查看出错信息
  10. java调用C++ DLL库方法
  11. SQL 无限级分类语句
  12. 毕向东tcp学习笔记1
  13. Docker动态给容器Container暴露端口
  14. mtd-utils交叉编译安装
  15. istio sidecar自动注入过程分析
  16. 错误界面 SQL2008备份集中的数据库备份与现有的数据库不同,错误号码:3154。
  17. ELK5.3日志分析平台&amp;部署
  18. (并发编程)线程 (理论-创建-lock-属性-守护,与进程的对比)
  19. 关于Androidstudio无法获取到所有的SDk版本,需要挂国内镜像的问题
  20. Lexicography

热门文章

  1. springBoot RabbitMq 转换json序列化
  2. 欧陆词典PEST2词库
  3. Centos7下安装mysql服务
  4. LeetCode 145 ——二叉树的后序遍历
  5. Java面试知多少
  6. Django基本目录详解
  7. pxe+kickstart无人值守安装
  8. jdk1.8新特性-Lambda表达式使用要点
  9. 手机站测试工具(node服务器)
  10. ajax的一些实用技巧