原题

KMP

方法一:

听说是ex-kmp——来自学姐

ex-kmp是处理两个串s和t之间,t的每一个后缀在s中的最长前缀的长度的一个算法。

它很像manacher(至少我和学姐这么认为),记录了一个maxright,对于当前t中的位置i,如果他小于等于maxright,那么他的答案等于产生当前maxright的该位的答案,如下图。

然后如果当前位加上当前答案是大于maxright的,那么把答案减小maxright后进行暴力匹配。

如果他是大于maxright的,那么我们就暴力匹配,eg。

每一位处理后进行maxright的更新。附代码如下(写的不好看,但是自认为逻辑清晰易懂)

for (int i=2;i<=n;i++)
{
if (maxr>=i)
{
a[i]=a[i-from+1];
if (a[i]+i>maxr)
{
a[i]=maxr-i+1;
while (i+a[i]<=n)
if (s[a[i]+1]==s[i+a[i]]) a[i]++;
else break;
}
}
else
{
while (i+a[i]<=n)
if (s[a[i]+1]==s[i+a[i]]) a[i]++;
else break;
}
if (i+a[i]-1>maxr) maxr=i+a[i]-1,from=i;
}

//这个代码是对s和s本身进行了处理……

然后我们只要枚举循环节的长度,然后可行的位置就是枚举完成的后一位的a值所覆盖的部分

//真××难想!

#include<cstdio>
#include<algorithm>
#define N 1000010
using namespace std;
int n,k,a[N],from,maxr,q[N],sum[N];
char s[N]; int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s+1);
a[1]=n;
for (int i=2;i<=n;i++)
{
if (maxr>=i)
{
a[i]=a[i-from+1];
if (a[i]+i>maxr)
{
a[i]=maxr-i+1;
while (i+a[i]<=n)
if (s[a[i]+1]==s[i+a[i]]) a[i]++;
else break;
}
}
else
{
while (i+a[i]<=n)
if (s[a[i]+1]==s[i+a[i]]) a[i]++;
else break;
}
if (i+a[i]-1>maxr) maxr=i+a[i]-1,from=i;
}
for (int i=1;i*k<=n;i++)
{
bool is=0;
for (int j=1;j<k;j++)
{
if (a[j*i+1]<i)
{
is=1;
break;
}
}
if (!is) q[i*k]++,q[min(i*k+a[i*k+1],i*(k+1))+1]--;
}
for (int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+q[i];
if (sum[i]>0) putchar('1');else putchar('0');
}
return 0;
}

方法二:

简单的kmp——来自子恒

首先,对于这道题,我们会得出一个答案:

如果一个字符串是n个长度为k循环节,那么next[n]=n-k(显然)

所以对于这道题也是一样的。

对于一个合法的字符串,他只有两种存在方式:

SSSSSSS

和SSSSSST

(A包含了x个S(也就是T),而B包含了y个S(也就是S-T))

如果是第一种情况,那么S重复的次数num是n/(n-next[n])(前提是整除),那么AB就是num/k,A就是num%k。判断条件位num/k>=num%k(因为A属于AB)

如果是第二种情况,那么A=T,B=SSSSS-T,AB的个数仍是num/k,A仍是num%k,因为T!=S,所以判定条件是num/k>num%k

O(n)即可!

//附上子恒大佬的代码

#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e6+5;
char s[N];
int nxt[N];
char ans[N];
void getnext(int m){
int j=0;
for(int i=2;i<=m;i++){
while(j!=0&&s[j+1]!=s[i])j=nxt[j];
if(s[j+1]==s[i])j++;
nxt[i]=j;
}
return;
}
int main(){
int m,k;
scanf("%d%d%s",&m,&k,s+1);
memset(ans,'0',sizeof(ans));
getnext(m);
for(int n=1;n<=m;n++){
int num=n/(n-nxt[n]);
if(n%(n-nxt[n])==0){
if(num/k>=num%k){
ans[n-1]='1';
}
}else{
if(num/k>num%k){
ans[n-1]='1';
continue;
}
}
}
ans[m]=0;
puts(ans);
return 0;
}

另外:这题卡输出,请用putchar!

鸣谢各位orz的耐心讲解!

[codeforces] 526D [51nod] 1554 欧姆诺姆和项链的更多相关文章

  1. 51nod 1554 欧姆诺姆和项链

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

  2. 51Nod 1554 欧姆诺姆和项链 (KMP)

    题意:中文题. 析:首先要使用KMP的失配函数 f ,对于长度为 i 的串,如果存在循环节那么  i % (i-f[i]) == 0,循环节的长度就是 i - f[i] ,当然次数就是 i / (i- ...

  3. 51NOD 1554 欧姆诺姆和项链 巧妙利用KMP

    请戳这里! #include<cstdio> #define N 1000100 char s[N]; int n,k,nxt[N],ans[N]; int main() { scanf( ...

  4. 51nod 1554:欧姆诺姆和项链——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1554 题目: 有一天,欧姆诺姆发现了一串长度为n的宝石串,上面有五颜六色 ...

  5. 51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)

    1548 欧姆诺姆和糖果 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 一天,欧姆诺诺姆来到了朋友家里,他发现了 ...

  6. 51nod——1548 欧姆诺姆和糖果

    一开始以为是贪心,然后发现没法贪.暴力枚举肯定T,于是用约束关系优化: 假设wr >= wb, 第一种情况:wr >= sqrt (c), 则此时最多吃c / wr个r,且c / wr & ...

  7. 51NOD欧姆诺姆和项链——KMP算法(非水题)

    >>点击进入原题测试<< 思路:好久不见,今天要开始真正写题了.这个题之前我的理解有点问题,导致写了很久最终都是一直都只能过样例.需要注意的是输出中每一个“1”都是和别的输出相 ...

  8. 51nod1548 欧姆诺姆和糖果

    思路: 只有兩種糖果,枚舉其中一種糖果的數量就可以得到一個可行解: 但總有一種糖果的數量是較少的,並且該數量小於sqrt(C): 簡單證明: 1.若有任一糖果的質量大於sqrt(C),則必定有一糖果的 ...

  9. 【Codeforces 526D】Om Nom and Necklace

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

随机推荐

  1. IDEA的使用方法(一)(IDEA基本快捷键)

    一个软件的快捷键显得尤为重要,接下来来讲讲快捷键 CTR+N 搜索类 CTR+SHIT+N 搜索文件 CTR+ALT+空格 代码提示(类似于 ALT+/) ALT+F7 查询在某处使用 CTR+Q 查 ...

  2. 神经网络系列学习笔记(四)——神经网络之RNN学习笔记

    不同于传统的FNNs(Feed-forward Neural Networks,前向反馈神经网络),RNNs引入了定向循环,能够处理那些输入之间前后关联的问题. RNNs的目的是用来处理序列数据. 具 ...

  3. 【js】【读书笔记】廖雪峰的js教程读书笔记

    最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...

  4. Hadoop2.8.0 源码编译

    一.下载源码并解压 二.检查以下几项 必须有网络!!! JDK 1.7+ 安装方法 java -version Maven 3.0 or later 安装方法 mvn -version Findbug ...

  5. 生成heap dump

    在查看内存泄露以及对内存问题中,要dump出当前内存堆存储快照,便于分析.有几种方法可以做,简介如下 一.intellij IDEA 由于我用的是intellij IDEA,所以没有介绍Eclipse ...

  6. 17 rest-framework框架的基本组件

    序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式.我们可以通过声明与Django ...

  7. 调试bug 技巧

    两天,一个小bug 我调试了两天,最终调试成功了.还是在别人的帮助下. 问题是刷新相关的.当用户登录了,其他的页面都要刷新.也就是加上一些参数. 但是有一个fragment一直加不上,其他挨着的两个都 ...

  8. python 发送 get post请求

    GET请求: python2.7: import urllib,urllib2 url='http://192.168.199.1:8000/mainsugar/loginGET/' textmod ...

  9. latex排版系统

    proTeXt - MiKTeX-based distribution for Windows proTeXt aims to be an easy-to-install TeX distributi ...

  10. 2018"百度之星"程序设计大赛 - 资格赛 - 题集

    1001 $ 1 \leq m \leq 10 $ 像是状压的复杂度. 于是我们(用二进制)枚举留下的问题集合 然后把这个集合和问卷们的答案集合 $ & $ 一下 就可以只留下被选中的问题的答 ...