题目链接

思路

\(SAM\)练手题,将原串重复一遍插入到\(SAM\)中,然后贪心走长度为n的一个路径即可。

不用担心会直接走到终点,根据\(SAM\)的构造方式可以发现会先走到前面的路径。

代码

/*
* @Author: wxyww
* @Date: 2019-07-11 11:09:25
* @Last Modified time: 2019-07-11 11:20:42
*/
#include<cstdio>
#include<map>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 600000 + 100;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node {
int len,fa;
map<int,int>ch;
}SAM[N << 1];
int lst = 1,tot = 1;
void add(int c) {
int cur = ++tot,p = lst;
SAM[cur].len = SAM[p].len + 1;
while(p && !SAM[p].ch[c]) {
SAM[p].ch[c] = cur;
p = SAM[p].fa;
}
if(!p) SAM[cur].fa = 1;
else {
int q = SAM[p].ch[c];
if(SAM[q].len == SAM[p].len + 1) SAM[cur].fa = q;
else {
int clone = ++tot;
SAM[clone] = SAM[q];
SAM[clone].len = SAM[p].len + 1;
while(p && SAM[p].ch[c] == q) {
SAM[p].ch[c] = clone;
p = SAM[p].fa;
}
SAM[q].fa = SAM[cur].fa = clone;
}
}
lst = cur;
}
int a[N];
int main() {
int n = read();
for(int i = 1;i <= n;++i) a[i] = read();
for(int i = 1;i <= n;++i) add(a[i]);
for(int i = 1;i <= n;++i) add(a[i]);
int p = 1;
for(int i = 1;i <= n;++i) {
printf("%d ",SAM[p].ch.begin() -> first);
p = SAM[p].ch.begin() -> second;
}
return 0;
}

最新文章

  1. ABP框架 - Swagger UI 集成
  2. Django 1.7 throws django.core.exceptions.AppRegistryNotReady: Models aren&#39;t loaded yet
  3. 取消vs2013在solution中单击打开文件的功能
  4. 关于strlen误用的一点记录
  5. imovie的快速入门
  6. iSCSI配置流程
  7. centos启用ftp功能
  8. 尝试在Linux上编译KestrelHttpServer
  9. 父类构造函数中的this指针在子类构造对象后,这个this指针指向什么
  10. log4j参数说明
  11. mysql server advanced 5.6基于oracle linux 6.6的安装
  12. EPROCESS KPROCESS PEB
  13. c语言_头文件_windows.h
  14. PHP安全之webshell和后门检测
  15. 三。Hibernate 注解形式
  16. WebService调用SSAS教程
  17. php 7 event 安装
  18. angularjs 获取$scope对象
  19. Oracle 12C -- truncate的级联操作
  20. 网络请求 爬虫学习笔记 一 requsets 模块的使用 get请求和post请求初识别,代理,session 和ssl证书

热门文章

  1. WPF 精修篇 样式继承
  2. shell 下
  3. Matlab2019a启动慢,寻找许可证耽误时间解决办法
  4. visdom 简单使用
  5. laravel中select2多选,初始化默认选中项
  6. PHPStorm设置等号对齐
  7. 黄聪:mysql的SQL_CALC_FOUND_ROWS 使用 类似count(*) 使用性能更高
  8. Requests库主要方法解析以及Requests库入门需要掌握的框架
  9. 数据库之MySQL与Python交互
  10. java基础(18):集合、Iterator迭代器、增强for循环、泛型