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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章