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

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1554

题目:

有一天,欧姆诺姆发现了一串长度为n的宝石串,上面有五颜六色的宝石。他决定摘取前面若干个宝石来做成一个漂亮的项链。

他对漂亮的项链是这样定义的,现在有一条项链S,当S=A+B+A+B+A+...+A+B+A的时候是漂亮的,这儿A,B是一些宝石串,“+”表示连接操作。S中有k+1个A和k个B组成。A和B可能是空串。

现在给出宝石串,问怎么切前几个才能得到一个漂亮的宝石项链。他切下来之后不会改变宝石的顺序。

样例解释:

在这个样例中前6个可以组成漂亮的串( A="", B="bca")。前7个也可以(A="b", B="ca")。

Input

单组测试数据。
第一行有两个整数n, k (1≤n,k≤1 000 000),表示宝石串原始的长度和在上文中提到的参数k。
第二行有n个由小写字母组成的串,表示原始宝石串。

Output

输出一行有n个01组成的字符串。第i(1≤i≤n)个位置是1的时候表示前i个宝石可以组成漂亮的宝石项链。

Input示例

样例输入1
7 2
bcabcab

Output示例

样例输出1
0000011

那么,很显然这是KMP比较难的题。

(因为我最开始想了暴力,然而看了数据范围emmmmmm……)

这里我们可以将原串分为两种串S与T。

那么可能会将其分为SSS……SSS或SSS……SSST。

对于第一种情况,显然我们可求S的个数num(num=n/(n-nxt[n]))(请见上篇文章)

那么num/k就是ABAB……BABA中AB所包含的S的个数,自然的num%k就是A所包含的S的个数。

由于B可空,所以num/k>=num%k。

对于第二种情况,思考一下发现num的求法同上。

那么我们将A=T,B=(S-T)+SSS……SSS。

AB的S个数仍然是num/k,T的S个数仍然是num%k。

但是T!=S,所以num/k>num%k

(PS.本题输出量巨大,请使用快速的输出方式)

#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;
}
时间: 2024-11-05 03:11:46

51nod 1554:欧姆诺姆和项链——题解的相关文章

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

题意:中文题. 析:首先要使用KMP的失配函数 f ,对于长度为 i 的串,如果存在循环节那么  i % (i-f[i]) == 0,循环节的长度就是 i - f[i] ,当然次数就是 i / (i-f[i]),对于这个题,如果恰好是一个循环节,也就是  i % (i-f[i]) == 0,那么这个串一定是 SSSSSS...SSS的形式,要想出现 k+1 个 A,1 个A,可以看作是 k 个 AB和另外一个A,当然 A 可能是空串,也可能不是,那么要一共出现 k 次,也就是AB中一共包含 i

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

1548 欧姆诺姆和糖果 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果.有蓝色和红色两种.他知道每颗红色糖果重Wr克,每颗蓝色糖果重Wb克.吃一颗蓝色糖果会给他带来Hb的欢乐值,吃一颗红色糖果会给他带来Hr的欢乐值. 欧姆诺姆最多只能吃C克的糖果,而且每一颗糖果不能只吃一半.现在他想通过吃蓝色和红色的糖果来获得最大的欢乐值. 样例解释:每一种糖果吃两颗即可.

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

一开始以为是贪心,然后发现没法贪.暴力枚举肯定T,于是用约束关系优化: 假设wr >= wb, 第一种情况 wr >= sqrt (c), 则此时最多吃c / wr个r,且c / wr <= sqrt (c),这样从0到c / wr枚举r的数量即可.为什么不枚举b的数量,因为c/wr更小.这样就获得了一个n <= sqrt (1e9) 的O (n)解法. 第二种情况wr < sqrt (c),设的wr >= wb自然 wb < sqrt (c),此时如果像上面那样

1548 欧姆诺姆和糖果 分类暴力 + 数学

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1548&judgeId=202758 首先,样例都已经知道,不能狂买一种,可能要分开买,第一种x个,第二种y个. 抽象起来,这题可以表达成.设买了红的x个,蓝的y个. 则有: x * Wr + y * Wb <= c    同时要使得Hr * x + Hb * y最大. 其实表达成这样没什么用,还是求不出. 分类如下: ①.当有一种物品的重量 >= sqrt(c

51nod1548 欧姆诺姆和糖果

思路: 只有兩種糖果,枚舉其中一種糖果的數量就可以得到一個可行解: 但總有一種糖果的數量是較少的,並且該數量小於sqrt(C): 簡單證明: 1.若有任一糖果的質量大於sqrt(C),則必定有一糖果的數量小於sqrt(C): 2.若兩種糖果質量均小於sqrt(C),則可能存在兩種糖果數量均大於sqrt(C)的解,但對於這種情況,可以做如下轉換: 因爲兩種糖果質量均小於sqrt(C),則必定可以找到一個數公倍數K(K<C),然後將K全部用其中一種糖填滿,以達到總質量不變的情況下令較少的糖果數量小於

51NOD 1773:A国的贸易——题解

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773 参考1:FWT讲解 https://www.cnblogs.com/RabbitHu/p/9182047.html 参考2:题解 https://www.cnblogs.com/ivorysi/p/9178577.html (令$\oplus$表示异或) 设$dp[i][j]$表示第$i$天$j$编号城市货物数. 因为只有$i \oplus j$的答案有一个1才能

51nod 1554 KMP思维题

题目为中文,因而不再解释题意. 首先遵循如下设定可以有以下几个结论:1,首先谈论下KMP的一个特殊性质:对于某一个特立独行的字符串:例如ABCDEF,在建立有限状态自动机之后,都会有,所有元素的失配边,指向0,也就是初始的那个元素.此时我们可以讲这个独立的元素及之前字符串理解为" 一个循环次数为1的循环串 ".对于其他情况,形如:ABCDEFGAB,可以将ABCDEFG理解为一个循环串,AB为下一个循环的两个多余元素,因此,我们可以把任意字符串看成" 一个循环串+若干独立元素

51nod 1201 整数划分(dp)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题解:显然是一道dp,不妨设dp[i][j]表示数字i分成j个一共有几种分法. 那么转移方程式为: dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] 表示将i - 1划分为j个数,然后j个数都+1 还是不重复,将i - 1划分为j - 1个数,然后j - 1个数都+1,再加上1这个数. 然后就是j的范围要知道1+2+

51nod 1376 最长递增子序列的数量(不是dp哦,线段树 + &#160;思维)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 题解:显然这题暴力的方法很容易想到就是以每个数为结尾最长的有多少个,但是这样显然会超时所以要想一个方法去优化,要么用stl要么就是数据结构 线段树是个可以考虑的对象因为这也是求区间的和于是稍微将原数组优化一下,按照大小排序一下然后再按照下标更新这样能确保有序.具体看一下代码 还有一点要提一下有时候要考虑两维的东西可以适当排一下序使其变成一维有序这样就方