Camp Schedule(kmp+模拟)

D. Camp Schedule

链接: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_41183791/article/details/88367062