题意:给定字符串,求所有前缀的最小后缀。

n≤2×107n\leq 2\times10^7n≤2×107

最小后缀就是Lyndon分解的最后一段。而Duval本质上是可以重复修改的增量算法,所以是可以做的。

记ansians_iansi​为前缀iii的最小后缀。设维护未确定的循环节的指针为i,j,ki,j,ki,j,k,即Si...k−1=t+t+...+t+t1S_{i...k-1}=t+t+...+t+t_1Si...k−1​=t+t+...+t+t1​,其中ttt为Lyndon Word,t1t_1t1​为其可空前缀,j=k−∣t∣j=k-|t|j=k−∣t∣

当Sj=SkS_j=S_kSj​=Sk​时,根据意识流,前缀jjj的最小后缀一定在[i,j][i,j][i,j]内。因为是个循环,所以ansk=ansj+k−jans_k=ans_j+k-jansk​=ansj​+k−j

当Sj<SkS_j<S_kSj​<Sk​,令j=ij=ij=i,此时Sj...kS_{j...k}Sj...k​是个Lyndon Word,所以ansk=jans_k=jansk​=j

当Sj>SkS_j>S_kSj​>Sk​,相当于t1t_1t1​这一段的ansansans都是假的,需要重新计算,不用管。但∣t1∣=1|t_1|=1∣t1​∣=1的时候会出一些奇怪的问题,需要把anskans_kansk​的值算出来,为iii或kkk。

复杂度O(n)O(n)O(n)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 20000005
using namespace std;
char s[MAXN];
int ans[MAXN];
const int MOD=1e9+7;
int main()
{int T;scanf("%d",&T);while (T--){scanf("%s",s+1);int n=strlen(s+1);for (int i=1;i<=n;i++) ans[i]=0;ans[1]=1;for (int i=1;i<=n;){int j=i,k=i+1;ans[k]=k;while (s[j]<=s[k]){if (s[j]==s[k]) ans[k]=ans[j]+k-j,++j;else ans[k]=j=i;++k;}while (i<=j) i+=k-j;ans[k]=i;}
//      for (int i=1;i<=n;i++) printf("%d%c",ans[i]," \n"[i==n]);int sum=0;for (int i=1,x=1;i<=n;i++,x=x*1112ll%MOD) sum=(sum+1ll*ans[i]*x)%MOD;printf("%d\n",sum);}return 0;
}

【杭电多校2020】Minimum Index【Lyndon Word】相关推荐

  1. 【杭电多校2020】Go Running【几何】【最小点覆盖】

    题意:有一个数轴,若干人在某个时刻开始从某个点朝某个方向按111的速度走若干时间.已知nnn个条件,形如tit_iti​时刻xix_ixi​的位置有人,求最少可能的人数. ∑n≤5×105\sum n ...

  2. 【杭电多校2020】Lead of Wisdom【搜索】【复杂度证明】

    题意:nnn件物品,每种物品有一个种类tit_iti​,四个属性ai,bi,ci,dia_i,b_i,c_i,d_iai​,bi​,ci​,di​,每个种类最多选一件物品,求 (100+∑ai)(10 ...

  3. 【杭电多校2020】Total Eclipse【贪心】【并查集】

    题意:nnn个点mmm条边的无向图,每个点有一个正点权,每次选择一个连通子图,将里面的权值都减111.求所有点权为000的最小步数. T≤10,n≤105,m≤2×105T\leq 10,n\leq ...

  4. 【杭电多校2020】Fibonacci Sum【斐波拉契通项】【推式子】

    题意:设FiF_iFi​为斐波拉契数列,求 ∑i=0N(FiC)k\sum_{i=0}^N(F_{iC})^ki=0∑N​(FiC​)k 模109+910^9+9109+9 N,C≤1018,k≤10 ...

  5. 【杭电多校2020】Distinct Sub-palindromes【结论】【构造】

    题意:长度为nnn的 本质不同的回文子串个数最少 的小写字母组成的字符串 的个数. n≤109n\leq 10^9n≤109 回文子串个数至少为不同字母的数量 显然 最少回文子串个数为min⁡(n,3 ...

  6. 杭电多校2020 第十场 C - Mine Sweeper HDU - 6879

    题目大意:(来源) t组输入,每组输入一个s 你需要输出一个r行c列的阵列,这个阵列中'X'代表炸弹,'.'表示没有炸弹 对于'.'这些位置都会有一个数值,这个值取决于这个位置附近8个位置,这8个位置 ...

  7. 【杭电多校2020】第八场1003.Clockwise or Counterclockwise

    题目链接 思路: 如果输出结果是顺时针则叉积方向向内,当结果是逆时针时叉积方向向外. 代码: #include<bits/stdc++.h> #define int long long # ...

  8. 2021杭电多校补题——第一场

    2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...

  9. 2022杭电多校(一)

    2022杭电多校(一) 文章目录 2022杭电多校(一) 一.比赛小结 二.题目分析及解法(基础题) 1001.String 1002.Dragon slayer 1003.BackPack 1004 ...

最新文章

  1. object.ReferenceEquals(a,b)
  2. JGG: 赵方庆、赵翔等开发高效捕获RNA病毒基因组的宏转录组建库测序新技术
  3. 小编教您Springboot项目中异常拦截设计与处理
  4. 缓存核心知识小抄,面试必备,赶紧收藏!
  5. POJ-2386-Lake Counting
  6. codeproject上的一款分页控件
  7. 云服务已一步一步“入侵”我们生活
  8. 可能是最好的单例模式
  9. Linux关机运行的脚本,Linux关机时执行指定脚本功能实现
  10. 4.3 createjs
  11. matlab 有约束最小化,求解带等式约束和最小化目标的LMI
  12. drawboard pdf拆分文件_Drawboard PDF 免费版
  13. Android 使用google地图通过经纬度获取详细地址
  14. C++初阶习题(牛客)【4】Fibonacci数列
  15. 《人工智能学家》启动2016世界人工智能智商测试,原理和方法
  16. 解决jmeter5.4.3在高分辨率下的显示问题
  17. SSM 项目 --------- 小米商城后台管理系统
  18. 使用GTK+获取屏幕分辨率并设置满屏显示效果
  19. Android:Environment.getExternalStorageDirectory 废弃
  20. 2021世界燕窝展|上海滋补品展谈燕窝可以提高人体的免疫力?

热门文章

  1. 谁还没个黑历史了。。。 | 今日最佳
  2. 万万想不到:吸烟的辐射量比原子弹爆炸点还厉害!
  3. 让 Python 更加充分的使用 Sqlite3
  4. 密西根州立大学计算机qs分数,2020年QS世界大学排名密歇根州立大学排名第144
  5. 设计模式在项目中的应用案例_设计模式在项目中的应用(初学者版)
  6. JAVA跟MYSQL数据库交互_【编写Java程序实现与Mysql数据库的连接,并交互性的实现简单查询,删除,修改,排序,显示等操作】...
  7. c++经典编程题_全国青少年软件编程等级考试C语言经典程序题10道十
  8. python如何使用geotools_基于GeoTools实现道路结点的提取
  9. ksu7对讲机调频软件_数字对讲机的群呼功能原理是什么?你了解多少?
  10. c#物联网_C# 基础知识系列- 16 开发工具篇