zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    Glide优化
    Java多线程知识点
    Android知识点
    Gradle的一些技巧和遇到的问题
    Python用Django写restful api接口
    Python写爬虫爬妹子
    用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式
    【Python】扫描指定文件夹下特定后缀的文件
    【Python】生成多级树结构的xml文件
    【转】【Linux】安装pyinstaller
  • 原文地址:https://www.cnblogs.com/kls123/p/10500254.html
Copyright © 2011-2022 走看看