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; }
以上是关于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中