呵呵,先贴一张图:(这就是我CodeForces的头像(至少现在是))

洛谷题目页面传送门 & CodeForces题目页面传送门

给定字符串\(a\),求它的每一个前缀,是否能被表示成\(m+1\)个字符串\(A\)和\(m\)个字符串\(B\)交错相连的形式,即求\(\forall i\in[1,|a|],\left[\exists A,\exists B,a_{1\sim i}=\underbrace{A+B+A+\cdots+A+B+A}_{m+1\text{个}A,m\text{个}B}\right]\)。

\(|a|\in\left[1,10^6\right]\)。

考虑把\(A+B\)看作一个整体,这样问题就转化为了求\(a\)的每一个前缀是否能被表示成\(m\)个字符串\(S\)相连再连上一个\(S\)的前缀(可以\(=\varnothing\),也可以\(=S\))。

我们先考虑怎么在短时间内知道一个\(a\)的前缀是否可以被表示为\(m\)个\(S\)相连,如果可以就再往后扩展。这是一个非常经典的问题。设要求的是\(a\)的前缀\(a_{1\sim i}\)。首先,得满足\(m\mid i\),于是我们可以枚举\(\dfrac im\),即\(|S|\)。然后如果\(a_{1\sim i-\frac im}=a_{1+\frac im\sim i}\),那么\(a_{1\sim i}\)可以被表示为\(m\)个\(S\)相连(这个很好证吧,错位相等)。我们可以拿\(a_{1+\frac im\sim i}\)去匹配\(a_{1\sim i-\frac im}\),这个显然可以哈希,而在枚举\(|S|\)时\(a_{1\sim i-\frac im}\)永远是\(a\)的前缀,所以也可以Z算法(如果聪明的读者还不知道Z算法是什么,please点击这个)。

接下来要考虑如何往后拓展。这个比较简单,往后拓展的那段子串长度一定\(\in[0,|S|]\),并且要与\(a\)的前缀匹配。这不正是Z算法的专长吗?\(\min(|S|,z_{a,m|S|+1})\)不就是能往后拓展的最长长度吗?这个最长长度也可以哈希+二分,但那复杂度就带\(\log\)了。对了,能往后拓展最长\(z_{a,m|S|+1}\)个,就意味着\(\forall i\in[m|S|,m|S|+z_{a,m|S|+1}]\),\(a_{1\sim i}\)都能被表示成\(m+1\)个字符串\(A\)和\(m\)个字符串\(B\)交错相连的形式,这是个区间答案赋成\(1\)的操作,可以用线段树或树状数组维护,但更简单的有差分。最后被赋成\(1\)的次数若\(>0\),则答案为\(1\),否则为\(0\)。

感觉说的不太清楚。。。具体看代码吧(也不一定能看懂啊):

#include<bits/stdc++.h>
using namespace std;
const int N=1000000;
int n/*|a|*/,m/*要被表示成m+1个A与m个B交错相连的形式*/;
char a[N+5];//字符串
int z[N+1];//z数组
void z_init(){//Z算法
z[1]=n;
int zl=0,zr=0;
for(int i=2;i<=n;i++)
if(zr<i){
while(i+z[i]<=n&&a[i+z[i]]==a[1+z[i]])z[i]++;
if(z[i])zl=i,zr=i+z[i]-1;
}
else if(i+z[i-zl+1]<=zr)z[i]=z[i-zl+1];
else{
z[i]=zr-i+1;
while(i+z[i]<=n&&a[i+z[i]]==a[1+z[i]])z[i]++;
zl=i;zr=i+z[i]-1;
}
}
int d[N+1];//差分数组
int main(){
cin>>n>>m>>a+1;
z_init();
for(int i=1;i*m<=n;i++)//枚举|S|
if(z[i+1]>=i*(m-1)){//a[1~i*m]可以被表示为m个S相连
// cout<<i<<" "<<i*m+min(i,z[i*m+1])<<"\n";
d[i*m]++;//往后拓展的左端点差分数组++
if(i*m+min(i,z[i*m+1])+1<=n)d[i*m+min(i,z[i*m+1])+1]--;//往后拓展的右端点的下一个差分数组--
}
int now=0;
for(int i=1;i<=n;i++){
now+=d[i];//现在now为i的答案被赋成1的次数
cout<<!!now;//转为bool值
}
return 0;
}

CodeForces 526D Om Nom and Necklace的更多相关文章

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

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

  2. Codeforces 526D Om Nom and Necklace (KMP)

    http://codeforces.com/problemset/problem/526/D 题意 给定一个串 T,对它的每一个前缀能否写成 A+B+A+B+...+B+A+B+A+B+...+B+A ...

  3. 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 ...

  4. 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 ...

  5. Codeforces C - Om Nom and Candies

    C - Om Nom and Candies 思路:贪心+思维(或者叫数学).假设最大值max(wr,wb)为wr,当c/wr小于√c时,可以枚举r糖的数量(从0到c/wr),更新答案,复杂度√c:否 ...

  6. 【Codeforces 526D】Om Nom and Necklace

    Codeforces 526 D 题意:给一个字符串,求每个前缀是否能表示成\(A+B+A+B+\dots+A\)(\(k\)个\(A+B\))的形式. 思路1:求出所有前缀的哈希值,以便求每个子串的 ...

  7. Codeforces ZeptoLab Code Rush 2015 D.Om Nom and Necklace(kmp)

    题目描述: 有一天,欧姆诺姆发现了一串长度为n的宝石串,上面有五颜六色的宝石.他决定摘取前面若干个宝石来做成一个漂亮的项链. 他对漂亮的项链是这样定义的,现在有一条项链S,当S=A+B+A+B+A+. ...

  8. CF526D Om Nom and Necklace

    嘟嘟嘟 我们可以把AB看成S,则要找的串可以写成SSSSA或者SSSSS.假设S出现了Q次,那么A出现了Q % k次,则B出现了 Q / k - Q % k次. 当ABABA是SSS的形式时,B可以为 ...

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

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

随机推荐

  1. 一秒完成springboot与logback配置

    1. 一秒配置与效果 1.1 一秒配置 ​ spring boot中无须添加任何依赖,直接在resources文件夹下面新建logback.xml文件,将以下代码复制过去,配置完成,可以使用了. &l ...

  2. 浅谈对static的理解

    相信很多朋友在面试过程中都遇到过关于static的相关题目,接下来我们来分析一下static. static(静态的),用来修饰成员变量,成员方法,它随着类的加载而加载,使用static修饰的数据可以 ...

  3. MyBatis OGNL表达式用法

    From<MyBatis从入门到精通> <!-- 4.7 OGNL用法 MyBatis常用的OGNL表达式: e1 or e2: e1 and e2 e1 == e2; e1 != ...

  4. VS2010 winform开发笔记---combox的SelectedIndexChanged事件及级联问题

    DisplayMember绑定需要显示的数据表字段, 而ValueMember绑定需要获取选择的项的值. 然后通过 combo.SelectedValue就可以取得选中项的值了. DisplayMem ...

  5. Docker+Maven+Jenkins在Devops中完整应用

    过去与现在 很早之前,当我们需要一个部署环境的时候,我们可能指的是一台PowerEdge R710 2U服务器,走一系列冗长的申请流程,然后上架到机房.调试网络.安装系统.调试环境.最终部署应用,就这 ...

  6. Mybatis方法入参处理

    1,在单个入参的情况下,mybatis不做任何处理,#{参数名} 即可,甚至连参数名都可以不需要,因为只有一个参数,或者使用 Mybatis的内置参数 _parameter. 2,多个入参: 接口方法 ...

  7. 利用gcc编译链接时出现 ‘undefined reference to `std::ios_base::Init::Init()’ 解决

    一般编译链接c++程序最好使用g++,若有如上的报错信息,需要在gcc后加上 -lstdc++ eg: gcc test.c -lstdc++ gcc和g++都是GNU的一个编译器. g++:后缀.c ...

  8. 在工作中常用的Linux命令

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 之前写过一篇 < 在公司做的项目和自己在学校做 ...

  9. 基于Ajax的前后端分离

    这种开发模式可以称为SPA (Single Page Application 单页面应用)时代. 这种模式下,前后端的分工非常清晰,前后端的关键协作点是 Ajax 接口.看起来是如此美妙,但回过头来看 ...

  10. 快速清理maven仓库中下载错误的文件

    有时候使用pom文件下载依赖文件的时候突然网络异常,可能会出现依赖文件出现破损,导致怎么都不能使用,也没有重新下载. 之前解决办法是找到出现破损的文件并删除,让其重新下载,但是这样效率很低,也很难找到 ...