• 算法原理:


    Duval算法时间效率O(n)O(n)O(n)
    此处谈一谈自己对算法原理的理解:
    k-j相当于循环节的长度,i到j之间可能会出现多个重复的lyndon串,所以后面更新i的时候用的是while。
    s[j]<s[k]的时候很好理解,s[j]包含在以i为起点的lyndon串中,j此时回退到起点,
    s[j]=s[k]时, j和k同时++,一直在向右移动匹配(i到j之间可能出现多个循环节),此时循环节的长度不变。
  • 例题
    • lyndon分解后每个lyndon串的右端点(字符串下标从1开始存)
      洛谷P6114
//Duval
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e6+10;
char s[maxn];
int ans = 0;
int lyndon()
{int n = strlen(s);int i = 0, j, k; //读入字符串的开始下标是0while(i < n){j = i, k = i+1;while(k<n && s[j]<=s[k]){if(s[j]==s[k]) j++, k++;else j = i, k++;}while(i <= j){i += k-j; //每个lyndon分解的右端点,此时的开始下标按1计算//cout << i << endl;ans ^= i;}}return ans;
}
int main()
{scanf("%s", s);printf("%d\n", lyndon());return 0;
}
  • s[i…n]的最小后缀的下标
    HDU6761
    pos[i]=ipos[i]=ipos[i]=i
    s[j]=s[k]:pos[k]=pos[j]+k−js[j]=s[k]: pos[k]=pos[j]+k-js[j]=s[k]:pos[k]=pos[j]+k−j
    s[j]<s[k]:pos[k]=is[j]<s[k]: pos[k]=is[j]<s[k]:pos[k]=i
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
const ll mod = 1e9+7;
char s[maxn];
ll ans; int n;
ll pos[maxn];
void  lyndon()
{int i = 0, j, k; //读入字符串的开始下标是0while(i < n){j = i, k = i+1;pos[i] = i;while(k<n && s[j]<=s[k]){if(s[j]==s[k]){pos[k] = pos[j]+k-j; //k-j相当于循环节j++;}else //回退到i{pos[k] = i;j = i;}k++;}while(i <= j) i += k-j;}
}
int main()
{int t;scanf("%d", &t);ll p = 0;while(t--){ans = p = 0;scanf("%s", s);n = strlen(s);lyndon();for(int i = 0; i < n; i++){p = p==0?1:p*1112ll%mod;ans = (ans%mod + (pos[i]+1)*p%mod)%mod;}printf("%lld\n", ans%mod);}return 0;
}
  • s[i…n]最大后缀下标

【算法原理+洛谷P6114+HDU6761】Lyndon分解相关推荐

  1. 通过“FBI树”复习二叉树算法(洛谷P1087题题解,Java语言描述)

    题目要求 P1087题目链接 分析 所谓的"FBI树",其实就是一种二叉树,最后的结果也无非就是二叉树的后序遍历序列. 所以,考察的知识点就是--二叉树基本算法的灵活运用. 本题关 ...

  2. 贪心算法:洛谷P1803凌乱的yyy解析(java)

    题目描述 相关链接:https://www.luogu.com.cn/problem/P1803 解析 这道题对于java来说,第一思路应该是贪心算法,创建一个二维数组(或者创建两个数组),然后对结束 ...

  3. 【题解】【算法】- 洛谷 - P3799 妖梦拼木棒(组合数学)

    题目背景 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来. 题目描述 有 n 根木棒,现在从中选 4 根,想要组成一个正三角形,问有几种选法? 答案对 109 + 7 取模. 输入格式 第一行一 ...

  4. 洛谷 P1028 数的计算

    递推计算即可 f[1]=1 f[2]=2=f[1]+1 f[3]=2=f[1]+1 f[4]=4=f[1]+f[2]+1 f[5]=4=f[1]+f[2]+1 我的代码(算法借鉴洛谷题解) #incl ...

  5. 洛谷p1216 IOI1994 Day1T1

    洛谷p1216 IOI1994 Day1T1 洛谷原题 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下 ...

  6. java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...

    点击上方"蓝字"关注我们了解更多算法思路01题目 题目来源:洛谷OJ 题目链接: https://www.luogu.com.cn/ 题目描述 已知正整数n是两个不同的质数的乘积, ...

  7. 深入理解 操作系统 LRU算法(以洛谷P1540题为例)

    LRU算法 LeastRecentlyUsedLeast Recently UsedLeastRecentlyUsed 算法,意为"最近最少使用",这是操作系统内存管理部分重要的一 ...

  8. 深入理解 操作系统 SJF算法(以洛谷P1223题为例)

    CPU Scheduling Algorithms 重要的CPU调度算法如下: FCFS Scheduling(First-Come, First-Served) SJF Scheduling(Sho ...

  9. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

  10. (快速幂算法+高精度)洛谷P1045 麦森数

    前言   故事的最后,让我们以一道十分经典的题目--<麦森数>来结尾.接受现实吧,总会有我们没准备过的高精度运算出现.我们固然可以提前把高精度的快速幂模板也准备好,但是总会有百密一疏的时候 ...

最新文章

  1. shell编程之数学运算
  2. 生成JSON数据--fastjson(阿里)方法
  3. leetcode复习1
  4. 让 jQuery UI draggable 适配移动端
  5. C++的使用Lambda
  6. python 写csv scrapy_Python神技能 | 使用爬虫获取汽车之家全车型数据
  7. Android系统(17)---Context 原理
  8. Android Studio打包Android Library为jar方案
  9. html如何添加子页面,html5 父页面调用子页面js方法
  10. ubuntu HackRF One相关环境搭建
  11. 关于假人皮肤外侧热传导问题的差分法求解
  12. C - 51 38译码器 动态数码管显示
  13. 校园网认证破解教程(广某大学)
  14. 鼠标离开 表格隐藏html,excel中滚动鼠标表格隐藏怎么取消
  15. 电影院订票选座小程序 电影小程序毕业设计 毕业论文 开题报告和效果图
  16. Android 在导航栏上添加一个截屏按键,点击进行截屏
  17. CUDA RuntimeError问题
  18. 定义一个长方形(Rectangle)类,有长、宽属性,对每个属性都提供相应的get/set方法。
  19. 数字电路实验怎么接线视频讲解_时间继电器怎么看图接线?这可是星三角接触器接线必备元件...
  20. 产品经理培训行业---以起点学院为主体的相关竞品分析报告

热门文章

  1. Python 画数学函数图像 matplotlib.pyplot
  2. 平面图判连通 蓝桥杯模拟赛题
  3. android layout_width 代码,关于LinearLayout设置权重后width或height不设置0dp的影响说明...
  4. java mp4转码 h264_10分钟学会Jave视频转码avi--gt;mp4(h264编码格式)!_Java_七九推...
  5. Cookie的简单理解和使用
  6. 迅雷java_Java实现迅雷地址转成普通地址
  7. 利用iis服务器创建站点,如何使用iis建立一个网站
  8. 在.net中序列化读写xml方法的总结
  9. Session 工作原理
  10. PHP面试常考内容之面向对象(2)