CF1137B Camp Schedule

Posted chillilly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1137B Camp Schedule相关的知识,希望对你有一定的参考价值。

CF1137B Camp Schedule

题意:s和t均由0和1构成。要求重组s串,使得t在s中出现的次数最多。

思路:
统计s中0和1的个数,基于t串构造新的s串。
设j是t的指针,从t串的首位开始依次向后:
如果t[j]对应的数字仍有剩余,输出t[j],否则退出循环,输出剩下的数字。
如果j已经到达t串的末尾,j退回到s[j]对应最长前缀的后一位。(相当于合并相同的前后缀)。因此,要求出t串的最长公共前后缀 Next数组。
如:s:1111110000 t:110011 ,当j到达t串末尾时,此时输出为110011;第一个t串的后缀11形成了后一个t串的前缀11。因此构成的新s串为:1100110011
 
AC代码:
技术图片
#include <iostream>
#include <cstring>
using namespace std;
const int N=500000+10;
int Next[N];
char s[N],t[N];

void GET_next(char* t, int Next[])
{
    int j = 0;
    int len=strlen(t+1);
    for(int i = 2; i <= len; i++){
        while(j && t[j+1] != t[i]){
            j = Next[j];
        }
        if(t[j+1] == t[i]) j++;
        Next[i] = j;
    }
}

int main()
{
    scanf("%s",s+1);
    scanf("%s",t+1);
    int l1=strlen(s+1);
    int l2=strlen(t+1);
    int s0=0,s1=0;
    
    for (int i=1;i<=l1;i++){
        if (s[i]==0) s0++;
        else s1++;
    }
    GET_next(t,Next);
    int j=1;
    for (int i=1;i<=l1;i++){
        if (t[j]==0){
            if (s0) {
                cout<<0;s0--;
            }
            else break;
        }
        else{
            if (s1) {
                cout<<1;s1--;
            }
            else break;
        }
        j++;
        if (j==l2+1) j=Next[l2]+1;
    }
    if (s0) for (int i=1;i<=s0;i++) cout<<0;
    if (s1) for (int i=1;i<=s1;i++) cout<<1;
    return 0;
}
View Code

 

以上是关于CF1137B Camp Schedule的主要内容,如果未能解决你的问题,请参考以下文章

CF gym 10326040th Petrozavodsk Programming Camp, Day 5,2021.2.3 水题2题

[react] Module not found: Can't resolve 'schedule' in 'C:Usersadcaldvmtn7myapp (代码片段

将片段中的Firebase信息检索到recyclerview中

Codeforces 1137B(kmp next数组构造)

codeforces1137B kmp(fail的妙用)

如何从后台弹出片段