../ Competitive Programming
-rw-r--r--aguang4.6 KiB3 min read

LeetCode Weekly Contest 278

1. Keep Multiplying Found Values by Two

  • Hash.
c++
class Solution
{
public:
    
    int findFinalValue(vector<int>& nums, int original)
    {
        unordered_set<int> s(nums.begin(), nums.end());
        
        while (s.find(original) != s.end())
        {
            original = original * 2;
        }
        
        return original;
    }
};

2. All Divisions With the Highest Score of a Binary Array

  • Preffix-sum.
c++
class Solution
{
public:

    vector<int> maxScoreIndices(vector<int>& nums)
    {
        vector<int> s0 = { 0 }, s1 = { 0 };
        
        for (auto &x : nums)
        {
            s0.push_back(s0.back() + (x == 0));
            s1.push_back(s1.back() + (x == 1));
        }
        
        int ans = INT_MIN;
        
        for (int i = 0; i <= nums.size(); i++)
        {
            int score = s0[i] + s1[nums.size()] - s1[i];
            
            ans = max(score, ans);
        }
        
        vector<int> ret;
        
        for (int i = 0; i <= nums.size(); i++)
        {
            int score = s0[i] + s1[nums.size()] - s1[i];
            
            if (score == ans)
            {
                ret.push_back(i);
            }
        }
        
        return ret;
    }
};

3. Find Substring With Given Hash Value

  • We can get the hash value from previous hash value in O(1)O(1) time.
c++
typedef long long ll;

class Solution
{
public:
    
    string subStrHash(string s, int power, int modulo, int k, int hashValue)
    {
        vector<ll> pk = { 1 };
        
        for (int i = 1; i <= k; i++)
        {
            pk.push_back(pk.back() * power % modulo);
        }
        
        int n = s.length();
        
        vector<ll> sn;
        
        for (auto &c : s)
        {
            sn.push_back(c - 'a' + 1);
        }
        
        ll now = 0, pos = n - k;
        
        for (int i = n - k, j = 0; i < n; i++, j++)
        {
            now = (now + sn[i] * pk[j]) % modulo;  
        }
        
        for (int i = n - k - 1; i >= 0; i--)
        {
            now = now * power + sn[i] - sn[i + k] * pk[k];
            
            now = now % modulo;
            
            while (now < 0)
            {
                now = now + modulo;
            }
            
            if (now == hashValue)
            {
                pos = i;
            }
        }
        
        return s.substr(pos, k);
    }
};

4. Groups of Strings

  • Bit-mask & Disjoint-set.
c++
class Solution
{
public:
    
    inline int getMask(string &w)
    {
        int mask = 0;
        
        for (auto &c : w)
        {
            mask |= 1 << (c - 'a');
        }
        
        return mask;
    }
    
    int parent[20000];
    
    inline int getParent(int x)
    {
        return parent[x] == x ? x : (parent[x] = getParent(parent[x]));
    }
    
    inline void merge(int x, int y)
    {
        x = getParent(x);
        y = getParent(y);
        
        if (x != y)
        {
            parent[x] = y;
        }
    }
    
    vector<int> groupStrings(vector<string>& words)
    {
        int n = words.size();
        
        vector<int> masks;
        
        for (auto &w : words)
        {
            masks.push_back(getMask(w));
        }
        
        for (int x = 0; x < n; x++)
        {
            parent[x] = x;
        }
        
        unordered_map<int, int> idx;
        
        for (int x = 0; x < n; x++)
        {
            int mask = masks[x];
            
            if (idx.find(mask) == idx.end())
            {
                idx[mask] = x;
            }
            else
            {
                merge(idx[mask], x);
            }
            
            for (int i = 0; i < 26; i++)
            {
                if (mask & (1 << i))
                {
                    int del = mask - (1 << i);
                    
                    if (idx.find(del) == idx.end())
                    {
                        idx[del] = x;
                    }
                    else
                    {
                        merge(x, idx[del]);
                    }
                }
            }
        }
        
        unordered_map<int, int> size;
        
        int cnt = 0, max_size = 0;
        
        for (int k = 0; k < n; k++)
        {
            int x = getParent(k);
            
            if (size.find(x) == size.end())
            {
                cnt++;
                size[x] = 0;
            }
            
            max_size = max(max_size, ++size[x]);
        }
        
        return vector<int>({ cnt, max_size });
    }
};

COMMAND INTERFACE

↑ ↓ navigate · Enter execute · Esc exit · try “whoami”

Loading filesystem…

:help aguang.xyz

A personal website disguised as an operating system.

Ctrl / Cmd + K
Command palette + full-text search
Tab / Shift + Tab
Move between links and controls
Enter
Open a focused link or search result
↑ / ↓ in search
Navigate search results
In a directory filter
Enter/Done or ↓ focuses a result; Esc clears the filter
Esc
Clear a search or close a window