D. Camp Schedule
题意
给两个01字符串a,b
将a改成字符串c,c里的1,0的个数和a相同
使得b作为子串在c中出现次数最多
解析:
如果alen>=blen kmp计算前缀跳转,模拟生成c,循环一次要跳转daonext2[blen]上
否则 直接输出str
ac:
#include<bits/stdc++.h>
#define MAXN 500005
using namespace std;
char str[MAXN],ctr[MAXN];
char gtr[MAXN];
int next2[MAXN];
void getnext()
{
int i=0,j=-1;
next2[0]=-1;
int m=strlen(ctr);
while(i<m)
{
if(j==-1||ctr[i]==ctr[j])
{
next2[++i]=++j;
}
else {
j=next2[j];
}
}
}
int main()
{
scanf("%s",&str);
scanf("%s",&ctr);
int alen=strlen(str);
int blen=strlen(ctr);
if(alen>=blen)
{
int sum=0;
for(int i=0;i<alen;i++)
if(str[i]=='1')
sum++;
int ans=alen-sum;
int q=0,p=0;
getnext();
for(int i=0,j=0;j<alen;i++,j++)
{
if(i==blen)//跳转
i=next2[blen];
if(q<sum&&ctr[i]=='1')
{
gtr[j]='1';
q++;
}
else if(p<ans){
gtr[j]='0';
p++;
}
else{
gtr[j]='1';
q++;
}
}
gtr[alen]='\0';
printf("%s\n",gtr);
}
else
printf("%s\n",str);
return 0;
}