我是靠谱客的博主 敏感唇膏,最近开发中收集的这篇文章主要介绍牛客练习赛88A 活着的证据B 寻寻觅觅寻不到C 踩不出足迹,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Powered by:NEFU AB-IN

A 活着的证据

  • 题意

    给出 S V S_V SV V V V S I S_I SI I I I,求能拼接成最大的 N N N位数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cuAKpo3z-1631357601854)(C:UsersliusyAppDataRoamingTyporatypora-user-imagesimage-20210911183637368.png)]

  • 思路

    模拟即可,多余的 I I I可以加到 V V V上,也可以加到 I I I

    /*
     * @Author: NEFU AB_IN
     * @Date: 2021-09-10 17:38:09
     * @FilePath: VscodeACMProjectdiameteracwing389_.cpp
     * @LastEditTime: 2021-09-10 19:31:56
     */
    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define MP make_pair
    #define SZ(X) ((int)(X).size())
    #define IOS                      
        ios::sync_with_stdio(false); 
        cin.tie(0);                  
        cout.tie(0);
    #define DEBUG(X) cout << #X << ": " << X << endl;
    typedef pair<int, int> PII;
    
    signed main()
    {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            int v, l, n;
            scanf("%d%d%d", &v, &l, &n);
            if (v + l <= n)
            {
                for (int i = 1; i <= v; i++)
                    printf("5");
                for (int i = 1; i <= l; i++)
                    printf("1");
            }
            else
            {
                int l_s = l - max(n - v, 0);
                for (int i = 1; i <= min(v, n); ++i)
                {
                    if (l_s >= 3)
                    {
                        printf("8");
                        l_s -= 3;
                    }
                    else if (l_s == 2)
                    {
                        printf("7");
                        l_s -= 2;
                    }
                    else if (l_s == 1)
                    {
                        printf("6");
                        l_s -= 1;
                    }
                    else
                    {
                        printf("5");
                    }
                }
                for (int i = 1; i <= n - v; ++i)
                {
                    if (l_s >= 2)
                    {
                        printf("3");
                        l_s -= 2;
                    }
                    else if (l_s == 1)
                    {
                        printf("2");
                        l_s -= 1;
                    }
                    else
                        printf("1");
                }
            }
            printf("n");
        }
        return 0;
    }
    

B 寻寻觅觅寻不到

  • 题意

    现代人有两个字符串,设其为 M M M C C C

    C C C 可以由 M M M 截取其中 K K K 个连续字符并放到最末尾得到,则现代人认为 C h i l d Child Child M o t h e r Mother Mother 怀抱里

    请对于 Q Q Q 组数据,做出判断

  • 思路

    写了一遍字符串哈希,结果T了,直接运用字符串的操作知识,模拟即可

    /*
     * @Author: NEFU AB_IN
     * @Date: 2021-09-11 10:27:58
     * @FilePath: VscodeACMNiuKe2021.9.10b.cpp
     * @LastEditTime: 2021-09-11 15:58:21
     */
    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define ULL unsigned LL
    #define MP make_pair
    #define SZ(X) ((int)(X).size())
    #define IOS                      
        ios::sync_with_stdio(false); 
        cin.tie(0);                  
        cout.tie(0);
    #define DEBUG(X) cout << #X << ": " << X << endl;
    typedef pair<int, int> PII;
    
    signed main()
    {
        IOS;
        int t;
        cin >> t;
        while (t--)
        {
            string m, c;
            int k;
            cin >> m >> c >> k;
            if (m == c)
            {
                cout << "YES" << 'n';
                continue;
            }
            string hou = c.substr(SZ(c) - k, SZ(c));
            c = c.substr(0, SZ(c) - k);
            int flag = 0;
            string c_tmp = c;
            for (int i = 0; c[i]; ++i)
            {
                c_tmp.insert(i, hou);
                if (c_tmp == m)
                {
                    cout << "YES" << 'n';
                    flag = 1;
                    break;
                }
                c_tmp = c;
            }
            if (!flag)
                cout << "NO" << 'n';
        }
        return 0;
    }
    

C 踩不出足迹

  • 题意

    定义为长度为 n n n 的数列,每个数字是一个 k k k 位的二进制数,同时保证 ∀ i ∈ [ 1 , n ] , a i < 2 k forall iin[1,n], a_i<2^k i[1,n],ai<2k

    令第一次得到的结果为 a 1 a_1 a1。你需要从第二个数开始,每次可以选择与上一次得到的结果异或或者同或起来

    求结果的最大值

  • 思路

    三个知识点

    • 同或和异或都具有可交换性
    • a ⊙ b = a ⊗ ¬ b a ⊙ b = a ⊗ ¬b ab=a¬b
    • a ⊗ ¬ b = ¬ a ⊗ b a⊗¬b=¬a⊗b a¬b=¬ab ¬ a ⊗ ¬ b = a ⊗ b ¬a⊗¬b=a⊗b ¬a¬b=ab

    先就将同或全部转为异或,这样会出来很多的取反的数,既然可交换,就把取反的数放在一起,就可以把取反消掉,那么最后不是剩下一个,就是全没了

    所以最后取全部异或的结果,和他的取反即可

    /*
     * @Author: NEFU AB_IN
     * @Date: 2021-09-11 16:25:46
     * @FilePath: VscodeACMNiuKe2021.9.10c.cpp
     * @LastEditTime: 2021-09-11 16:30:10
     */
    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define MP make_pair
    #define SZ(X) ((int)(X).size())
    #define IOS                      
        ios::sync_with_stdio(false); 
        cin.tie(0);                  
        cout.tie(0);
    #define DEBUG(X) cout << #X << ": " << X << endl;
    typedef pair<int, int> PII;
    
    namespace IO
    {
        char ibuf[1 << 21], *ip = ibuf, *ip_ = ibuf;
        char obuf[1 << 21], *op = obuf, *op_ = obuf + (1 << 21);
        inline char gc()
        {
            if (ip != ip_)
                return *ip++;
            ip = ibuf;
            ip_ = ip + fread(ibuf, 1, 1 << 21, stdin);
            return ip == ip_ ? EOF : *ip++;
        }
        inline void pc(char c)
        {
            if (op == op_)
                fwrite(obuf, 1, 1 << 21, stdout), op = obuf;
            *op++ = c;
        }
        inline __int128_t read()
        {
            __int128_t x = 0, ch = gc(), w = 1;
            for (; ch < '0' || ch > '9'; ch = gc())
                if (ch == '-')
                    w = -1;
            for (; ch >= '0' && ch <= '9'; ch = gc())
                x = x * 10 + ch - 48;
            return w * x;
        }
        template <class I>
        inline void write(I x)
        {
            if (x < 0)
                pc('-'), x = -x;
            if (x > 9)
                write(x / 10);
            pc(x % 10 + '0');
        }
        class flusher_
        {
        public:
            ~flusher_()
            {
                if (op != obuf)
                    fwrite(obuf, 1, op - obuf, stdout);
            }
        } IO_flusher;
    }
    using namespace IO;
    
    int n, k;
    const __int128_t one = 1;
    
    signed main()
    {
        scanf("%d %d", &n, &k);
        __int128_t ans = 0;
        for (int i = 1; i <= n; ++i)
        {
            ans ^= read();
        }
        write(max(ans, ans ^ ((one << k) - 1)));
        return 0;
    }
    

完结。

最后

以上就是敏感唇膏为你收集整理的牛客练习赛88A 活着的证据B 寻寻觅觅寻不到C 踩不出足迹的全部内容,希望文章能够帮你解决牛客练习赛88A 活着的证据B 寻寻觅觅寻不到C 踩不出足迹所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部