首页 > 其他分享 >第 405 场周赛

第 405 场周赛

时间:2024-07-08 15:56:02浏览次数:8  
标签:周赛 hash int res len ++ 405 vector

3210. 找出加密后的字符串

class Solution {
public:
    string getEncryptedString(string s, int k) {
        int n = s.size();
        string t = s;
        for(int i = 0; i < n ; i ++)
            t[i] = s[(i + k) % n];      
        return t;
    }
};

3211. 生成不含相邻零的二进制字符串

深搜

class Solution {
public:

    vector<string> validStrings(int n) {
        vector<string> res;
        auto dfs  = [n,&res](auto && self, string s) -> void {
            if(s.size() == n){
                res.push_back(s);
                return ;
            }
            self(self, s + "1");
            if(s.back() != '0') self(self, s + "0");
            return;
        };
        dfs(dfs, "0");
        dfs(dfs, "1");
        sort(res.begin(), res.end());
        return res;
    }
};

3212. 统计 X 和 Y 频数相等的子矩阵数量

二维前缀和

class Solution {
public:
    int numberOfSubmatrices(vector<vector<char>>& grid) {
        int n = grid.size(), m = grid[0].size();
        vector X(n, vector<int>(m));
        vector Y(n, vector<int>(m));
        for(int i = 0 ; i < n; i ++)
            for(int j = 0; j < m; j ++) {
                if(grid[i][j] == 'X') X[i][j] ++;
                else if(grid[i][j] == 'Y') Y[i][j] ++;
            }
        for(int i = 0; i < n; i ++ )
            for(int j = 0; j < m; j ++){
                if(i > 0) X[i][j] += X[i - 1][j], Y[i][j] += Y[i - 1][j];
                if(j > 0) X[i][j] += X[i][j - 1], Y[i][j] += Y[i][j - 1];
                if(i > 0 and j > 0) X[i][j] -= X[i - 1][j - 1], Y[i][j] -= Y[i - 1][j - 1];
            }
        int res = 0;
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++){
                if(X[i][j] >  0 and X[i][j] == Y[i][j]) res ++;
            }
        return res;
    }
};

3213. 最小代价构造字符串

\(f[i]\)表示长度为\(i\)的前缀构成的最小代价,枚举长度\(len\),如果存在和\([i - len + 1, i]\)子串相同的串\(words[k]\),则存在转移\(f[i] = f[i - len] + cost[k]\)

快速的查找串是否存在可以用字符串哈希实现。

\(words[i]\)长度的和不超过\(5e4\),则说明长度的种类数不操作\(\sqrt{5e4}\)。因此只枚举存在的长度即可,复杂度\(O(N\sqrt(5e4))\)

class Solution {
public:
    int minimumCost(string target, vector<string>& words, vector<int>& costs) {
        const int mod = 998244353;
        int n = target.size();
        const int base = 19260817;
        vector<int> pow_base(n + 1), pre_hash(n + 1);
        pow_base[0] = 1;
        for (int i = 1; i <= n; i++) {
            pow_base[i] = (long long)pow_base[i - 1] * base % mod;
            pre_hash[i] = ((long long)pre_hash[i - 1] * base + target[i - 1]) % mod;
        }
        auto calc_hash = [&](int l, int r) -> int { // 计算 [l, r) 哈希值
            return (pre_hash[r] - (long long)pre_hash[l] * pow_base[r - l] % mod + mod) % mod;
        };
        
        map<int, unordered_map<int,int>> min_cost;
        for(int i = 0; i < words.size(); i ++) {
            int hash_val = 0;
            for(auto c : words[i])
                hash_val = ((long long)hash_val * base % mod + c) % mod;
            int len = words[i].size();
            if(min_cost[len].count(hash_val))
                min_cost[len][hash_val] = min(min_cost[len][hash_val], costs[i]);
            else 
                min_cost[len][hash_val] = costs[i]; 
        }

        vector<int> f(n + 1, INT_MAX / 2);
        f[0] = 0;
        for(int i = 1; i <= n; i ++) {
            for(const auto &[len, mc] : min_cost) {
                if(len > i) break;
                if(f[i - len] >= f[i]) continue;
                auto it = mc.find(calc_hash(i - len, i));
                if(it == mc.end()) continue;
                f[i] = min(f[i], f[i - len] + it -> second);
            }
        }
        return f[n] == INT_MAX / 2 ? - 1 : f[n];
    }
};

标签:周赛,hash,int,res,len,++,405,vector
From: https://www.cnblogs.com/PHarr/p/18290049

相关文章

  • 牛客周赛 Round 50 D[小红的因式分解] 超级无敌大暴力
    牛客周赛Round50D小红的因式分解超级无敌大暴力首先拿到这个题,真的是一头雾水,本蒟蒻今天才想出来。。。首先拆开式子,我们可以得到a1a2==a;a1b2+a2b1==b;b1b2==c;那么,我们只需要求解一对a1与b1即可得到本题答案,因为剩下的一对a2b2由a/a1和b/b1得到所以我们可以运用......
  • 牛客周赛 Round 50
    这场还是差点 A.小红的最小最大题意:min(a,b)+x是不是比max(a,b)如果比它大输出YES否则输出NOCode:#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);inta,b,x;cin>>......
  • leetcode404周赛(1,2,3)
    1.三角形的最大高度题意:给你两个整数red和blue,需要用这些求组成一个三角形,相邻行颜色必须不同,求最大高度思路:第一行放一个,第二行放两个第三行放三个,我们可以按奇数偶数行来计算总和,此时有两种情况,先蓝后红,先红后蓝,此时针对于第i行来说,如果先蓝后红此时对应奇偶行的蓝的......
  • (对结果分类讨论)牛客周赛 Round 1 C.游游的交换字符
    题意:思路:观察发现相邻元素不同的结果只有两种,要么是101010101...要么是010101010,因此我们可以对结果分类讨论。直接模拟算出两种情况最少需要操作多少次,再取min即可。需要注意的是,如果是奇数串,那么结果只有一种,数量多的一定要放两侧。code:#include<bits/stdc++.h>#includ......
  • 牛客周赛 Round 44
    A题每三张删除一张,n/3就是答案点击查看代码#include<bits/stdc++.h>#defineall(x)(x).begin(),(x).end()#definefifirst#definesesecondusingi64=longlong;usingpii=std::pair<int,int>;template<typenameT>std::vector<T>read(T&n......
  • 牛客周赛 Round 49 (D~F)
    嘤嘤不想求异或喵think:首先l和r的范围有1e18,我们能要到要么是二分(但这题显然和二分无关),所以我们尝试打表找规律.打表发现x是4的倍数,1~x的异或和应该是x,同理其他也是有规律的.#include<bits/stdc++.h>#definefifirst#definesesecond#defineintlonglongusin......
  • 牛客周赛 Round 49
    A题按题目输出即可#include<bits/stdc++.h>#defineall(x)(x).begin(),(x).end()#definefifirst#definesesecond#definelowbit(x)(x)&(-x)usingi64=longlong;usingpii=std::pair<int,int>;voidsolve(){i64a,b;std::cin>......
  • 「蓝桥·算法双周赛」第 3 场 算法季度赛
    1.全国科普行动日【算法赛】#include<iostream>usingnamespacestd;intmain(){cout<<"6.29";return0;}2.A%B【算法赛】#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingi128=__int1......
  • 牛客周赛49
    比赛链接:牛客周赛49赛时感受A思路    代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=1e5+10;intmain(){lla,b;cin>>a>>b;cout<<a-b*11<<endl;return0;}B思路......
  • 牛客周赛 Round 47
    A、小红的葫芦水一篇代码实现#include<bits/stdc++.h>#ifdefLOCAL#include"algo/debug.h"#else#definedebug(...)42#endifintmain(){std::cin.tie(nullptr)->sync_with_stdio(false);intn=5;std::vector<int>a(n);fo......