题意

传送门 HDU 3374 String Problem

题解

求字符串中字典序最小与最大的循环同构串,并求解对应的起始字符在原字符串中出现的位置最早的一个,以及这个循环同构串出现的次数。

最小/大表示法

字符串字典序最小/大的循环同构串称为字符串的最小/大表示。设字符串 SSS 长度为 nnn,最小/大表示法的可以 O(n)O(n)O(n) 求解,区别只在于字典序的判断。以最小表示法的求解为例,将原串 SSS 复制一份接在其结尾,得到的字符串记为 SSSSSS,则有 SS[i,i+n),i∈[0,n)SS[i, i+n),i\in[0, n)SS[i,i+n),i∈[0,n) 为 SSS 的以 iii 为起始位的循环同构串。

对于任意的 i,ji,ji,j,观察其字典序比较过程, 设 k(k<n)k(k<n)k(k<n) 为以 i,ji,ji,j 为起始位置的循环同构串的最长前缀匹配长度,若 SS[i+k]>SS[j+k]SS[i+k]>SS[j+k]SS[i+k]>SS[j+k],那么对于以位置 [i,i+k][i,i+k][i,i+k] 为起始位置的循环同构串,都存在对应的起始位置 [j,j+k][j,j+k][j,j+k] 的字典序更小的循环同构串,跳过这些位置,一定不会遗漏最小表示的起始位置。于是初始化 i=0,j=1i=0,j=1i=0,j=1,不断比较以 i,ji,ji,j 为起始位置的循环同构串,若 k<nk<nk<n,则按照上述规则不断跳过不可能为备选答案的位置,最终当 i≤ni\leq ni≤n 或 j≤nj\leq nj≤n 时,所有循环同构串都进行过比较,那么 min(i,j)min(i,j)min(i,j) 即最小表示的起始位置;若出现 k=nk=nk=n 的情况,说明 SSS 有更小的循环元,由于 i,ji,ji,j 从左向右扫描,则 i,ji,ji,j 分别为最小表示的最小起始位置和次小起始位置,则 max(i,j)−min(i,j)max(i,j)-min(i,j)max(i,j)−min(i,j) 为最小循环元的长度。

那么,若求解最小表示法时出现 k=nk=nk=n,那么 min(i,j)min(i,j)min(i,j) 为最小表示对应的起始字符在原字符串中出现的位置最早的一个,出现次数为 n/[max(i,j)−min(i,j)]n/[max(i,j)-min(i,j)]n/[max(i,j)−min(i,j)];反之,SSS 不存在更小的循环元,min(i,j)min(i,j)min(i,j) 为最小表示对应的起始字符在原字符串中出现的位置最早的一个,出现次数为 111。

循环元存在性证明

方便起见,设字符串长度为 xxx,设 i,ji,ji,j 从左向右扫描出现的最早满足 k=xk=xk=x 情况的下标分别为 000 和 y,y∈[1,x)y,y\in[1,x)y,y∈[1,x),对应的循环同构串为 A,BA,BA,B。

先证必要性。若 SSS 存在长度小于 xxx 的循环元,设其长度为 yyy,那么以 kt,t∈[0,x/y)kt,t\in [0,x/y)kt,t∈[0,x/y) 为起始位置的循环同构串相等,则比较字典序时出现 k=xk=xk=x 情况。

再证充分性,若 y∣xy\mid xy∣x,此时
A[n−y,n)=B[n−2y,n−y)=A[n−2y,n−y)A[n-y,n)=B[n-2y,n-y)=A[n-2y,n-y)A[n−y,n)=B[n−2y,n−y)=A[n−2y,n−y) 递推到边界,可以观察到 A,BA, BA,B 是按照循环节的长度交错排列的,且存在长度为 yyy 的循环节;若 y∤xy\nmid xy∤x,按照上述思路递推,在边界上有
A[0,y)=S[0,y)=B[n−y,n)=B[x%y,x%y+y)=A[x%y,x%y+y)A[0,y)=S[0,y)=B[n-y,n)=B[x\% y,x\%y+y)=A[x\%y,x\%y+y)A[0,y)=S[0,y)=B[n−y,n)=B[x%y,x%y+y)=A[x%y,x%y+y) 设 x′=y,y′=x%yx'=y,y'=x\%yx′=y,y′=x%y,则得到规模缩小的原问题。设 f(x,y)f(x,y)f(x,y) 代表字符串长度为 xxx,222 个循环同构串起始位置索引差值为 yyy 且相等时原串 SSS 是否存在长度小于 xxx 的循环节,那么有
f(x,y)=f(y,x%y)f(x,y)=f(y,x\%y)f(x,y)=f(y,x%y) 递归问题的形式与欧几里德算法一致,边界情况 f(gcd(x,y),0)f(gcd(x,y),0)f(gcd(x,y),0) 不满足 y∈[1,x)y\in[1,x)y∈[1,x),但可以推出递归的前一步为真,以其为递归的终点,则可以判断 f(x,y)f(x,y)f(x,y) 为真,且循环节长度为 gcd(x,y)gcd(x,y)gcd(x,y)。

#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000005;
char S[maxn * 2];
int n, rnk, t;void solve(bool f)
{int i = 0, j = 1, k;while (i < n && j < n){for (k = 0; k < n && S[i + k] == S[j + k]; ++k);if (k == n){rnk = min(i, j), t = n / (max(i, j) - rnk);return;}bool g = (!f && S[i + k] > S[j + k]) || (f && S[i + k] < S[j + k]);if (g)i += k + 1, i += i == j;elsej += k + 1, j += i == j;}rnk = min(i, j), t = 1;
}int main()
{while (~scanf(" %s", S)){n = strlen(S);memcpy(S + n, S, sizeof(char) * n);solve(0);printf("%d %d ", rnk + 1, t);solve(1);printf("%d %d\n", rnk + 1, t);}return 0;
}

HDU 3374 最小 / 大表示法相关推荐

  1. 一维OTSU法、最小交叉熵法、二维OTSU法及C++源码

    1.最大类间方差法(Otsu法) 该算法是日本人Otsu提出的一种动态阈值分割算法.它的主要思想是按照灰度特性将图像划分为背景和目标2部分,划分依据为选取门限值,使得背景和目标之间的方差最大.(背景和 ...

  2. 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))

    目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...

  3. 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)

    目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...

  4. Lasso回归算法: 坐标轴下降法与最小角回归法小结

    前面的文章对线性回归做了一个小结,文章在这: 线性回归原理小结.里面对线程回归的正则化也做了一个初步的介绍.提到了线程回归的L2正则化-Ridge回归,以及线程回归的L1正则化-Lasso回归.但是对 ...

  5. 智能车阳光算法(含大津法)

    ** ## 智能车阳光算法 ** 谈不上真正的阳光算法,但是对于一些光干扰的场景和一些有噪点的图像还是可以进行处理. 在之前主流的摄像头主要是ov7725这个摄像头的优点就是硬件二值化,它的处理速度比 ...

  6. 最大类间方差法(大津法OTSU)原理

    算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分.当取最 ...

  7. 二值化-大津法(OTSU)

    论文 Otsu N . A Threshold Selection Method from Gray-Level Histograms[J]. IEEE Transactions on Systems ...

  8. 最大类间方差(大津法)详解

    参考: https://www.cnblogs.com/xiaomanon/p/4110006.html 一.算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫 ...

  9. 最优化理论-线性规划中的大M法的步骤

    目录: 一.引言 二.线性规划的基本概念 三.最优化理论中的大M法     1. 大M法的基本思想     2. 大M法的步骤     3. 大M法的优缺点 四.大M法的应用     1. 生产计划问 ...

最新文章

  1. 安装hadoop图文
  2. 第1关:实现一个顺序存储的线性表
  3. layui遍历json数组_Python列表边遍历边删除,怎么用才不报越界错误呢?
  4. 重新分区_完全不需要装软件!教你轻松调整硬盘分区
  5. 微信小程序wx.navigateTo路由循环嵌套问题解决
  6. Robot Application Builder
  7. 为什么我的会话状态在ASP.NET Core中不工作了?
  8. 邮箱无权访问 上的 jira是怎么回事_蚂蚁庄园答案2020年11月6日汇总 小鸡宝宝考考你每日答案为你呈上|蚂蚁|庄园-360GAME...
  9. C,C++宏中#与##的讲解
  10. 桌面计算机打不开win8.1,Win8.1怎么进桌面 2种Win8.1开机直接进桌面方法
  11. MATLAB切比雪夫带通滤波器
  12. 普通IC、M1、UID、CUID、FUID、UFUID卡的区别
  13. 视频教程-轻松搞定Spring全家桶(初识篇)-Java
  14. android虚拟应用沙箱,Android的SandBox(沙箱)
  15. 中国菜刀使用与原理分析
  16. 中文打字速度测试软件单机版,中文打字速度测试软件
  17. r76800h怎么样r7 6800h参数
  18. 三圣花乡享地道农家乐
  19. 当金融科技遇上云原生,蚂蚁金服是怎么做安全架构的?
  20. 甲骨文最新改邮箱、改账户名、改密码教程

热门文章

  1. 用 C语言模拟买猫的过程
  2. 投影仪对和电视哪个对眼睛好?有区别吗?
  3. KDE-Graphics(KDE图形图像软件)先容
  4. 蓝屏代码0x00000074
  5. uploadFile+nginx实现上传图片(Windows/Linux均可用)
  6. 科学家与艺术家心中都装着什么
  7. iphone计算机要电话,有了这个神器,在PC上也能接听iPhone电话、收发短息啦(安卓也可以哦~)...
  8. c语言数据类型与表达式,C语言的基本数据类型与表达式.ppt
  9. python做飞机大战游戏_python实现飞机大战游戏
  10. 微信域名防封,细说微信域名防封技术原理