题目链接:点击查看

题目大意:给出一个主字符串s,再给出一个子字符串ss,主串和子串都是只由0或1所组成的字符串,现在要求重组主串s,要求重组后的字符串:

  1. 所包含的0与1的个数与之前保持一致
  2. 尽可能多的包含子串ss

求出重组后满足上述条件的字符串

题目分析:这个题目一开始我想简单了,就用贪心去构造了,是可以过掉样例,以及寥寥几个测试点的,后来队友提醒我了才知道,原来子串ss在新构造的字符串中是可以重叠的!也就是说若给出的主串是111000,子串是1010,我们需要构造成101010,这样可以包含两个子串,大概就是因为可以重叠的原因,所以就不能直接贪心构造了,或者说贪心的话情况比较难讨论,因为涉及到了重叠问题,我们可以想到KMP中next数组的定义了,next数组的定义就是前缀和后缀的最大匹配度,当我们构造完一个子串s后,我们接下来不用从头再开始构造子串,而是寻找一下最大前缀和后缀所匹配的地方,然后在这个地方后面的一个单位继续构造即可,因为都匹配了,所以上一个构造好的子串的后缀,就可以充当下一个需要构造的子串的前缀,这样构造的话,最后答案一定是最优解

对了,这个题目记得用char字符串,用stirng类会超时

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=5e5+100;char a[N],b[N],ans[N];int nx[N];int cnt[2];void getnext()//得到子串的next数组
{nx[0]=-1;int i=0,j=-1;int len=strlen(b);while(i<len){if(j==-1||b[j]==b[i])nx[++i]=++j;elsej=nx[j];}
}int main()
{
//  freopen("input.txt","r",stdin);scanf("%s%s",a,b);int lena=strlen(a);int lenb=strlen(b);for(int i=0;i<lena;i++)cnt[a[i]-'0']++;getnext();for(int i=0,j=0;i<lena;i++,j++){if(j==lenb)//若当前子串的指针到头了,就回到前缀后的位置j=nx[j];if(cnt[b[j]-'0'])//如果需要构造的元素还有,就直接用{ans[i]=b[j];cnt[b[j]-'0']--;}else//否则就只能用另一种元素了{ans[i]='0'+(b[j]-'0')^1;cnt[(b[j]-'0')^1]--;}}printf("%s\n",ans);return 0;
}

CodeForces - 1137B Camp Schedule(KMP的next数组+构造)相关推荐

  1. CodeForces - 182D Common Divisors(KMP的next数组)

    题目链接:点击查看 题目大意:给出两个字符串s和t,求这两个字符串有多少个公因子,规定若字符串n为其公因子,则: 设lens是字符串s的长度,lent是字符串t的长度,lenn是字符串n的长度,需要满 ...

  2. KMP中next数组的理解

    next数组是KMP的核心,但对于next数组我们总是有时候感觉明白了,但有时候又感觉没明白,现在我就说下我自己对KMP中next数组的理解,首先next[i]上的数字的意义,next[i]表示的是当 ...

  3. HDU - 1358 Period(KMP的next数组求最小循环节)

    题目链接:点击查看 题目大意:给出一个长度为n的字符串,问有哪些前缀是周期性字符串 题目分析:因为n给的很大,所以肯定不能暴力判断了,我们可以巧妙的利用kmp的next数组进行判断,next数组有一个 ...

  4. HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)

    题目链接:点击查看 题目大意:现在规定想要制作一串珍珠手链,需要用到两段一模一样的字符串首位相接而成,现在给定一个字符串,问最少需要添加几个珍珠才能满足条件 题目分析:一开始以为是个简单的模拟题,但后 ...

  5. KMP的Next数组应用总结

    Next数组求法 不用初始化,因为Next数组是递推出来的.用法为getFail(s,strlen(s)). const int MAX_N=101000; char str[MAX_N],patte ...

  6. Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)

    题目链接: https://codeforces.com/contest/432/problem/D 题解: 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大 ...

  7. CodeForces - 432D Prefixes and Suffixes(KMP的next数组性质)

    题目链接:点击查看 题目大意:给出一个字符串,求满足条件的所有子字符串在主串中出现的次数,条件就是当前子字符串在主串中既是前缀也是后缀 题目分析:因为今天小冰给我讲了一个与next数组配合的dp,也就 ...

  8. CodeForces - 126B Password(KMP中next数组)

    题目链接:点击查看 题目大意:给出一个字符串s,要求在字符串中找出一个子字符串t,要求t在s中出现了至少三次,一次在前缀,一次在后缀,一次在中间 注意一下,这里的前缀不能包括最后一个字母,后缀不能包括 ...

  9. KMP的next[]数组

    KMP是众多字符串问题的基础 理解next数组尤为重要 next又称前缀数组 是 它所处位置的前一个位置的元素 与 该链 链首开始 几个元素相匹配(即相同) 举个实例来说明: next对应的是该位置的 ...

最新文章

  1. 2021-03-15 Lp信号
  2. 概率论-4.4 特征函数(待补充)
  3. 深度解密Go语言之Slice
  4. C# 之 获取文件名及拓展名
  5. 13--长度最小的子数组
  6. 模式窗体 winform 1201
  7. 【opencv学习】【轮廓检测】
  8. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造
  9. c语言编程ppt免费下载,概述C语言编程.ppt
  10. 微软代码审查工具_Microsoft如何进行代码审查?
  11. vue框架对接手机app
  12. LeetCode LCP 03. 机器人大冒险(前缀和)
  13. Shell中IF大于等于小于
  14. 使用shareSDK调用QQ好友分享遇到的问题
  15. 怎么讲计算机e盘设置共享,共享盘怎么设置(电脑如何设置共享盘)
  16. 和monkey的相处日记
  17. 恩与爱是扯不开的 —— 李安
  18. Nacos 配置管理
  19. 谈谈C++中的swap函数
  20. [AFCTF2018]可怜的RSA

热门文章

  1. Gateway网关-路由的过滤器配置
  2. Nginx系统环境准备
  3. Maven依赖项的适用范围scope
  4. Spring Cloud Stream 与 Kafka 整合
  5. 动态数据源切换的底层原理-DynamicDataSourceEntry
  6. 环绕通知(Around Advice)
  7. 通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程
  8. SpringMVC的请求-获得请求参数-请求参数类型
  9. Spring编程模型:Spring实现了哪些编程模型?
  10. Apollo客户端读取数据原理