题目传送门

题意:给出$s$和$t$两个串,让你构造出一个答案串,使得答案串中的01数量和s一样,并且使$t$在答案串中作为子串出现次数最多。

思路:

  要想出现的次数尽可能多,那么就要重复的利用,哪一部分是可以重复利用的呢?就是前缀和后缀相同的部分,然后我们就想到了$kmp$算法中$fail$函数就是求这个东西的,那么我们先对t串fail一遍得到$next$数组,然后先使前缀出现一次,然后就使除了前缀以外的后缀尽可能出现的多,这样得到的答案串必定是最多的,最后把剩余的01输出就可以了。

  记住扫描字符串的for循环千万不要用(i<strlen(s))当条件,否则就是个$n2$的算法了(你会tle15)。

#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
int n,f[maxn],a,b;
char s[maxn],p[maxn];
void fail(){
f[]=-;
for(int j=;j<n;j++)
{
for(int i=f[j-];;i=f[i])
{
if(p[j]==p[i+]){
f[j]=i+;
break;
}else if(i==-)
{
f[j]=-;
break;
}
}
}
for(int i=;i<n;i++)f[i]++;
}
int main(){
while(scanf("%s",s)!=EOF)
{
scanf("%s",p);
n=strlen(p);
fail();
a=b=;
int si=strlen(s);
for(int i=;i<si;i++)
{
if(s[i]=='')a++;
else b++;
}
int xx=,yy=;
for(int i=;i<f[n-];i++)
{
if(p[i]=='')xx++;
else yy++; }
if(a>=xx&&b>=yy)
{
for(int i=;i<f[n-];i++)printf("%c",p[i]);
a-=xx,b-=yy;
int xxx=,yyy=;
for(int i=f[n-];i<n;i++)
{
if(p[i]=='')xxx++;
else yyy++;
}
int flag=;
while(a>&&b>)
{
if(a<xxx||b<yyy)break;
for(int i=f[n-];i<n;i++)
{
printf("%c",p[i]);
}
a-=xxx,b-=yyy;
}
while(a>){
printf("");
a--;
}
while(b>){
printf("");
b--;
}
puts("");
}else{
printf("%s\n",s);
}
}
}

codeforces1137B kmp(fail的妙用)的更多相关文章

  1. [BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表)

    [BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表) 题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段 ...

  2. KMP(fail数组应用) LA 3026 Period

    题目传送门 题意:(训练指南P213) 求每个前缀的最短循环节 分析:利用失配函数的性质,如果i % (i - fail[i]) == 0,那么正好错位移动一个循环节长度. #include < ...

  3. BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )

    写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...

  4. 关于Trie KMP AC自动机

    个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也 ...

  5. UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]

    UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...

  6. BZOJ 3670: [Noi2014]动物园 [KMP]

    求这玩意: 对于字符串S的前i个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i] 对1,000,000,007取模的结果 n≤5,L≤1,00 ...

  7. BZOJ3796 Mushroom追妹纸 字符串 SA KMP

    原文链接https://www.cnblogs.com/zhouzhendong/p/9253173.html 题目传送门 - BZOJ3796 题意 找一个串 $w$ 满足: 1.$w$ 是 $s_ ...

  8. Codeforces 808G Anthem of Berland - KMP - 动态规划

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个字符串$s$,和一个字符串$t$,$t$只包含小写字母,$s$包含小写字母和通配符'?'.询问$t$可能在$s$中出现最多多少次. 原 ...

  9. hdu1686 Oulipo kmp

    题目传送门 思路:kmp模板,稍微修改下 #include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using name ...

随机推荐

  1. code1225 搭积木

    题目分析:将当前层定义为第h层,共用了n块积木,本层积木数为m,f(h,n,m) 那么可以扩展数两种状态:f(h-1,n-m,m-1),f(h-1,n-m,m+1) 直接搜索可能的数据达到h^m,超时 ...

  2. c#反射优化 表达式树

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  3. 白盒测试实践项目(day3)

    李建文同学的白盒缺陷报告已经提交,正在由组长胡俊辉同学进行审阅,查看并发现是否有什么不足,再由小组讨论补充. 汪鸿同学的静态代码工具熟悉已经初步完成,并且准备撰写文档. 杨瑞丰同学的Mock测试方法也 ...

  4. explain分析sql效率

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...

  5. 使用#include消除重复代码

    消除重复代码代码很多种,比如: 1)提炼成函数复用 2)使用宏 3)继承 4)使用闭包(boost::bind.boost::function) 上述是最为常用的,对于C++程序,闭包可能用得相对少一 ...

  6. Delphi 中调用JS文件中的方法

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  7. [Postgres]Postgres单用户模式执行VACUUM

    # su - postgres $ /usr/local/pgsql/bin/postgres --single -D /usr/local/pgsql/data [不能VACUUM的数据库] Pos ...

  8. EasyUI combobox动态增加选择项

    有需求需要动态的为combobox增加可选项,后来解决方案如下 html如下 <select id="workerList"></select> js 如下 ...

  9. PHP开发实用-阿里短信服务(Short Message Service)

    步骤 1 使用阿里云短信服务正常发短信需要 短信签名 短信模板 1申请短信签名   根据用户属性来创建符合自身属性的签名信息.企业用户需要上传相关企业资质证明,个人用户需要上传证明个人身份的证明.   ...

  10. uwsgi启动提示:probably another instance of uWSGI is running on the same address (:8002). bind(): Address already in use [core/socket.c line 769]

    提示8002端口被占用,可以这样终止掉后再启动 sudo fuser -k 8002/tcp