Codeforces 526 D

题意:给一个字符串,求每个前缀是否能表示成\(A+B+A+B+\dots+A\)(\(k\)个\(A+B\))的形式。

思路1:求出所有前缀的哈希值,以便求每个子串的哈希值。然后枚举\(A+B\)的长度,二分\(A\)的长度,用哈希检查一下字符串是否相等即可。

思路2:求出KMP的\(fail\)数组,然后枚举前缀的长度\(len\),看该前缀的最小循环节\(min=len-fail_{len}\)(因为\(A+B+A+B+\dots+A+B+A\)中前缀\(A+B+A+B+\dots+A\)与后缀相等,所以\(A+B\)的长度就是如此求出),

则\(|A+B|=q\times min\),

所以\(len=k\times|A+B|+|A|=k\times q\times min+x\ (0\leq x\leq q\times min)\)。

然后得\(k\times q\times min\leq len\leq (k+1)\times q\times min\)。

所以\(\frac{len}{(k+1)\times min}\leq q\leq \frac{len}{k\times min}​\)

那么既然\(q\)为整数,则\(q\)在\([\lceil \frac{len}{(k+1)\times min}\rceil,\lfloor \frac{len}{k\times min}\rfloor]\)中。

进行判断即可。

思路3:同样求出KMP的\(fail\)数组。然后构建\(i\)跳转\(2^j\)次\(fail\)后得到的位置的倍增表,枚举前缀的长度\(len\)。

对于一个前缀,\(|A+B|\)最极端的情况是\(A\)为空或\(B\)为空,两种情况分别\(|A+B|\)为\(\frac{len}{k}\)和\(\frac{len}{k+1}\),所以可以求出\(|A+B|\)的范围。下面只要看通过倍增表是否能从\(len\)跳至\(len-|A+B|\)的范围即可。

思路4:\(Z\_Algorithm\)求出\(Z\)数组表示与前缀向后最长匹配长度,然后枚举\(|A+B|\),判断是否循环\(k\)次,再将最后一个\(A\)可取的最长长度通过\(Z\)数组算出,差分区间修改每一个前缀是否可以即可。

【Codeforces 526D】Om Nom and Necklace的更多相关文章

  1. Codeforces 526.D Om Nom and Necklace

    D. Om Nom and Necklace time limit per test 1 second memory limit per test 256 megabytes input standa ...

  2. 【Henu ACM Round#16 F】Om Nom and Necklace

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中 ...

  3. Codeforces 526D - Om Nom and Necklace 【KMP】

    ZeptoLab Code Rush 2015 D. Om Nom and Necklace [题意] 给出一个字符串s,判断其各个前缀是否是 ABABA…ABA的形式(A和B都可以为空,且A有Q+1 ...

  4. Codeforces - ZeptoLab Code Rush 2015 - D. Om Nom and Necklace:字符串

    D. Om Nom and Necklace time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  6. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  7. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  8. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  9. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

随机推荐

  1. java设计模式-----12、外观模式

    Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种.Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面.这个一致的简单的界面被称作facade. ...

  2. python *args,**kwargs用法

    *args用于接受传入的值,无限制,但是不能接收key类型的,如c=2 def fun(*args): for i in args: print(i) print("test") ...

  3. 一. Redis 常用命令

    键值相关命令 1. KETS 查询所有的key 127.0.0.1:6379> keys * 1) "tony"2) "hexu1"3) "he ...

  4. 浅谈Java多线程中的join方法

    先上代码 新建一个Thread,代码如下: package com.thread.test; public class MyThread extends Thread { private String ...

  5. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 前台request 获取body的格式是正确的 (2018-03-23 16:44:22) 但是Java 后台却格式化成了yyyy-MM-dd的格式 巨坑(@InitBinder搞得贵)

    最近做项目时,同事写的功能总是格式化时间不正确,Java类属性明明注解了@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")  但就是硬 ...

  6. 05-sudo权限配置

    阅读目录 基础环境准备 服务端配置 客户端配置 客户端验证 附:sudo常见属性介绍 常见错误分析 1. 基础环境准备 本文接文章openldap服务端安装配置 2. 服务端配置 导入sudo sch ...

  7. 利用Spring的AbstractRoutingDataSource解决多数据源的问题

    多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题. 解决方法如下: 1.首先配置多个datasource <bean ...

  8. 视频截图Util

    ​​ VideoToPicUtil.java package com.zhwy.util; import java.io.File; import java.util.ArrayList; impor ...

  9. [SequenceFile_2] SequenceFile 的基本操作

    0. 说明 测试序列文件的读写操作 && 测试序列文件的排序操作 && 测试序列文件的合并操作 && 测试序列文件的压缩方式 && 测试 ...

  10. dell r420 H310/H810阵列配置教程及常见问题

    进入H310/H810阵列卡BIOS界面 阵列卡管理快捷键 如何创建RAID0和RAID1和RAID5 阵列修复篇 Foreign(外来)状态的硬盘应如何处理 1.进入H310/H810阵列卡BIOS ...