Codeforces Round #545 (Div. 2) D

链接:http://codeforces.com/contest/1138/problem/D

啊啊啊啊啊啊,自闭啊,比赛的时候判断条件 if(s1[i-1]==‘0‘) aa++;写成了 if(s1[i]==‘0‘) aa++;少写了个-1,被hack了,上分场变成了掉分场。

思路;

题目需要t字符串出现次数最多,那么找到最大的重叠部分就好了,然后依次加上就好了

主要就是要找到字符串t与本身的重叠部分,,假设有两个t,第一个t不变,第二个t向右移动:

比如:

10101010

-10101010 ->  一直向右移直到重叠部分相等

如:

10101010

-- 10101010   如这种情况 重叠部分为: 101010 ,题目需要最多的t字符串,我们只需要先摆上一个 t ,然后每补上一次t重叠部分这样就可以多出现一次t.最后算下能出现几次,输出出来,剩余的0和1直接跟在后面输出。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define mid int m = (l + r) >> 1
#define ll long long
const int M = 1e5 + 10;
string s,s1;
int main()
{
    int a=0,b=0,a1=0,b1=0;
    cin>>s;
    int len = s.size();
    cin>>s1;
    int len1 = s1.size();
    for(int i = 0;i < len;i ++){
        if(s[i]==‘0‘) a++;
        else b++;
    }
    for(int i = 0;i < len1;i ++){
        if(s1[i]==‘0‘) a1++;
        else b1++;
    }
    int k;
    if(a1==0) k = b/b1;
    else if(b1 == 0) k = a/a1;
    else k = min(a/a1,b/b1);
    if(k==0){
        cout<<s<<endl;
    }
    else{
        int en = len1;
        int aa = 0,bb = 0,aa1 = 0,bb1 =0;
        for(int i = 1;i < len1;i ++){
            int flag = 0;
            if(s1[i-1]==‘0‘) aa++;
            else bb++;
            if(s1[len1-i]==‘0‘) aa1++;
            else bb1++;
            if(aa!=aa1||bb!=bb1) continue;
            for(int j = 0;j < len1-i;j ++){
                if(s1[i+j]!=s1[j]){
                    flag = 1;
                    break;
                }
            }
            if(flag == 0){
                en = i;
                break;
            }
        }
        //cout<<en<<endl;
        int a2 = 0;int b2 = 0;
        if(en != len1){
            for(int i = len1 - en;i < len1;i ++){
                if(s1[i]==‘0‘) a2++;
                else b2++;
            }
        }
        else {
            a2 = a1,b2 = b1;
        }
        a-=a1; b-=b1;
        cout<<s1;
        int k1;
        if(a2==0) k1 = b/b2;
        else if(b2 == 0) k1 = a/a2;
        else k1 = min(a/a2,b/b2);
        for(int i = 1;i <= k1;i ++){
            for(int j = len1-en;j < len1;j ++)
                cout<<s1[j];
        }
        a -= a2*k1; b -= b2*k1;
        for(int i = 1;i <= a;i ++)
            cout<<0;
        for(int i = 1;i <= b;i ++)
            cout<<1;
        cout<<endl;
    }
}

原文地址:https://www.cnblogs.com/kls123/p/10500254.html

时间: 2024-10-03 02:31:27

Codeforces Round #545 (Div. 2) D的相关文章

Codeforces Round #545 (Div. 2) 掉分记

每次CF后,我的rating下降,掉分让我悲痛欲绝 ——题记 ### 前言 这次 CF 时间可谓是极好的,17:05 开始,时长 2h 30min. 4:40 回到家,开电脑. 在看了一会书后,比赛开始了. ### 正文 首先,第一个掉分的 flag 出现了! 卡,卡,卡! CF 又双叒叕卡了! 1分钟过去了…… 2分钟过去了…… 3分钟过去了…… Dashboard 一直打不开.. 当时间已经接近 17:10 分的时候,我终于打开了 A 题.. 然而,这还并不是我掉分的所有原因. 先迅速浏览了

Codeforces Round #545 (Div. 2)A. Sushi for Two

全世界最笨的人 出现了 这题真的好欺骗我的感情,表面上先给我过了,让我快乐一下,背地里再把我给踢掉 TUT干嘛这么坏啊!!!!!!!!!!!!! 好吧,其实这个错误昨天晚上就反过了 但是世界上最笨的女同学她是不会改的 如果你下次还不改 那你还是世界上最笨的女同学 如果你改了 那你...... TUT... 我们来分析一下,为什么这个女同学,连A题都过不了 这题的题意很简单,就是要求长得像AAABBB的序列的最大值 我先选了一种很弱智的方法 就是,先求前面那个连续序列的长度,再求后面那个连续序列的

Codeforces Round #545 Div. 1自闭记

A:求出该行该列各有多少个比其小的取max,该行该列各有多少个比其大的取max,加起来即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define N 1010 char ge

Codeforces Round #545 (div 1.)

B.Camp Schedule 给两个 $01$ 串 $s$ 和 $t$,你可以将 $s$ 串任意重排,要求最大化 $t$ 在 $s$ 子串中出现的次数,可以重叠 $|s|,|t| \leq 500000$ sol: 看到可以重叠,考虑最大化利用重叠部分 重叠部分是这次 $t$ 串的结束和下次 $t$ 串的开始,也就是 $t$ 串的一个 $border$ 先放一个 $border$ ,之后一直放 $t$ 串的除 $border$ 以外的部分就可以了 #include <bits/stdc++.h

Codeforces Round #545 (Div. 2)D(KMP,最长公共前后缀,贪心)

#include<bits/stdc++.h>using namespace std;const int N=1000007;char s1[N],s2[N];int len1,len2;int nex[N];int cnt1[7],cnt2[7];int main(){    scanf("%s %s",s1+1,s2+1);    len1=strlen(s1+1);    len2=strlen(s2+1);    for(int i=1;i<=len1;i++

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd