【题目链接】

  • 点击打开链接

【思路要点】

  • 考虑一种暴力维护候选点集的做法。
  • 即,在字符串不断增长的同时,若已经可以确定 TiT_iTi​ 不再可能成为字典序最小的循环后缀,则将 iii 在候选点集中删除。
  • 一个显然的事实是,令当前字符串已有 kkk 位,考虑 i&lt;ji&lt;ji<j ,若 Lcp(Ti,Tj)&lt;k−j+1Lcp(T_i,T_j)&lt;k-j+1Lcp(Ti​,Tj​)<k−j+1 ,则说明 Ti,TjT_i,T_jTi​,Tj​ 在原串的第 kkk 位之前比较出了大小,从而 Ti,TjT_i,T_jTi​,Tj​ 中较大的一个不再可能成为字典序最小的循环后缀。
  • 此外,若 Lcp(Ti,Tj)≥k−j+1Lcp(T_i,T_j)\geq k-j+1Lcp(Ti​,Tj​)≥k−j+1 ,则说明 Ti,TjT_i,T_jTi​,Tj​ 在原串的第 kkk 位之前不能比较出大小,若 k−j+1≥j−ik-j+1\geq j-ik−j+1≥j−i ,即原串的前 kkk 位形如 ABBCABBCABBC ,且 Ti=BBCA,Tj=BCAB,T2j−1=CABBT_i=BBCA,T_j=BCAB,T_{2j-1}=CABBTi​=BBCA,Tj​=BCAB,T2j−1​=CABB 。注意到若 BCA≤CABBCA\leq CABBCA≤CAB ,有 Ti≤Tj≤T2j−iT_i\leq T_j\leq T_{2j-i}Ti​≤Tj​≤T2j−i​ ;若 BCA≥CABBCA\geq CABBCA≥CAB ,有 Ti≥Tj≥T2j−iT_i\geq T_j\geq T_{2j-i}Ti​≥Tj​≥T2j−i​ ,因此 TjT_jTj​ 不再可能成为字典序最小的循环后缀。
  • 从而候选点集大小为 O(LogN)O(LogN)O(LogN) 级别,可以每次暴力重构。
  • 计算答案时需要找到 TiT_iTi​ 最小的候选点,注意到此时我们只需比较某一后缀与原串的大小关系,可以在运行拓展 kmpkmpkmp 算法后实现 O(1)O(1)O(1) 比较。
  • 时间复杂度 O(NLogN)O(NLogN)O(NLogN) 。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3e6 + 5;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); }
template <typename T> void read(T &x) {x = 0; int f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';x *= f;
}
template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {write(x);puts("");
}
char s[MAXN];
int n, len[MAXN];
void exkmp(int n) {len[1] = n;int Max = 1, pos = 1;for (int i = 2; i <= n; i++) {if (i <= Max) len[i] = min(len[i - pos + 1], Max - i + 1);while (i + len[i] <= n && s[i + len[i]] == s[1 + len[i]]) len[i]++;if (i + len[i] - 1 > Max) {Max = i + len[i] - 1;pos = i;}}
}
int main() {scanf("%s", s + 1);exkmp(n = strlen(s + 1));vector <int> points;for (int i = 1; i <= n; i++) {points.push_back(i);vector <int> newpoints;for (auto x : points) {bool flg = true;while (!newpoints.empty()) {int tmp = newpoints.back();if (s[i] > s[tmp + i - x]) flg = false;if (s[i] >= s[tmp + i - x]) break;newpoints.pop_back();}if (flg && (newpoints.empty() || i - x + 1 < x - newpoints.back())) newpoints.push_back(x);}points = newpoints;int ans = points[0];for (int j = 1; j < points.size(); j++) {int x = points[j], tmp = ans + i - x + 1;if (len[tmp] >= i - tmp + 1) {int tnp = i - tmp + 2;if (len[tnp] < i - tnp + 1 && s[tnp + len[tnp]] < s[1 + len[tnp]]) ans = x;} else if (s[1 + len[tmp]] < s[tmp + len[tmp]]) ans = x;}printf("%d ", ans);}return 0;
}

【LOJ3103】「JSOI2019」节日庆典相关推荐

  1. 【LOJ】#3103. 「JSOI2019」节日庆典

    LOJ#3103. 「JSOI2019」节日庆典 能当最小位置的值一定是一个最小后缀,而有用的最小后缀不超过\(\log n\)个 为什么不超过\(\log n\)个,看了一下zsy的博客.. 假如\ ...

  2. 「JSOI2019」节日庆典 (Z-Algorithm)

    传送门 考虑一个后缀 Si...nS_{i...n}Si...n​,如果加上一个任意字符 ccc 可以使得 Si...ncS_{i...n}cSi...n​c 为字典序最小的后缀,那么将其称为好后缀, ...

  3. LOJ #3103. 「JSOI2019」节日庆典

    题意 给定字符串 \(S\) ,对于 \(S\) 的每个前缀 \(T\) 求 \(T\) 所有循环同构串的字典序最小的串,输出其起始下标.(如有多个输出最靠前的) \(|S| \le 3 \times ...

  4. 教师节特辑丨网易云信:素质教育「名师」是如何炼成的?

    又到一年教师节,在这个特殊的节日里,你的脑海中会浮现什么? 是老师们每天的谆谆教诲与循循善诱,还是他们带来的妙趣横生.灵动鲜活的课堂,亦或是他们创造的科技感十足.多维互动的教学模式? 说起教学模式,科 ...

  5. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  6. 人民创意联合《国家人文历史》独家首发「诗经」端午主题数字藏品

    利用数字技术开展文物保护.文化传承在全世界已经成为了一股强劲的浪潮.中共中央办公厅.国务院办公厅近日印发的<关于推进实施国家文化数字化战略的意见>中提出,到"十四五"时 ...

  7. 2021玉林芳草中学高考成绩查询,「分数线」2020年成都玉林中学招生录取分数线...

    学校名称 录取分数线 成都列五中学 596 成都武侯高级中学 570 成都玉林中学办学效益 成都玉林中学(Chengdu Yulin High School)位于成都高新南区 是四川省示范性普通高中 ...

  8. 大白天「撞鬼」?特斯拉在无人墓地感应到行人,传感器真能测鬼?

    点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 本文转载自:新智元 来源:twitter  |  编辑:小匀 [导读]特斯拉会通过传感器.摄像 ...

  9. 在「生机」与「升级」持续的化学反应之中,科技企业走向新生

    「当我站在一片漆黑的屋子里,外面也是一片漆黑.但是,在这样一片漆黑的环境里,我看到的是远处城市里的点点灯光,而这灯光带给我的,便是勃勃的生机.」白鸦在一年一度的春季发布会上如是说.同样地,正是因为如此 ...

最新文章

  1. 通过data:image/png;base64把图片直接写在src里
  2. [分享]毕业了【其实不想毕业】
  3. HDU 6114 Chess 【组合数】(2017百度之星程序设计大赛 - 初赛(B))
  4. 9、使用GROUP BY分组查询
  5. 机器学习(二)Logistic回归(Logistic regression)算法
  6. php程序里如何实现图片翻页,php图片上传代码一例-php 生成翻页链接(页码)列表的...-带多种分页方式的php分页类_169IT.COM...
  7. html菜单栏用户点击完自动收缩,几个不错的自动收缩菜单导航效果
  8. Python内置函数sorted()从入门到精通
  9. 廖雪峰python教程-Python简介
  10. 题解-Codeforces671D Roads in Yusland
  11. Java基础笔记(三)
  12. 数组的声明、创建、初始化
  13. [英语学习]3招速成英语发音 背景音乐和学习随感
  14. scrapy爬虫框架结构
  15. Hunger Snake
  16. 王宇阳:六个案例里的SEO启发
  17. windows10上安装mysql(详细步骤)
  18. 基于51单片机的烟雾火灾报警系统
  19. 3D变电站vr建模三维展示可视化管理系统
  20. pdcp层的作用_pdcp层的主要功能

热门文章

  1. iPhone手机如何将短信同步到安卓手机上
  2. SQL基本使用(通俗易懂,适合适合0基础的小伙伴们)
  3. iOS应用开发之权限说明
  4. 苹果、三星手机无线充电解析
  5. Mac电源适配器充不上电解决方案
  6. 服务器云化,以一当十 华为服务器顺应云化和融合趋势
  7. 如何将QSFP+端口转换为SFP+端口?
  8. 高考415分能上计算机网络的学校吗,2021高考415分能上什么学校 可以报哪些学校...
  9. 阿里平头哥数字IC验证笔试题
  10. Oracle函数获取IDCARD中年龄