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;
}