library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub firiexp/library

:heavy_check_mark: string/lcs_bit.cpp

Verified with

Code

int LCS_bit(string &s, string &t){
    const int n = s.size(), m = t.size(), bit_sz = (m+63)>>6;
    vector<vector<ull>> p(256, vector<ull>(bit_sz, 0));
    for (int i = 0; i < m; ++i) {
        p[t[i]][i>>6] |= (1ULL << (i&63));
    }
    vector<ull> dp(bit_sz);
    for (int i = 0; i < m; ++i) {
        if(s[0] == t[i]) {
            dp[i>>6] |= (1ULL << (i&63));
            break;
        }
    }
    for (int i = 1; i < n; ++i) {
        ull shift = 1, sub = 0, tmp_sub = 0;
        for (int j = 0; j < bit_sz; ++j) {
            ull x = dp[j] | p[s[i]][j], y = (dp[j] << 1)|shift, z = x;
            shift = dp[j] >> 63;
            tmp_sub = z < sub;
            z -= sub;
            sub = tmp_sub;
            sub += z < y;
            z -= y;
            dp[j] = (z^x)&x;
        }
        dp[m>>6] &= (1LLU << (m&63))-1;
    }
    int ans = 0;
    for (int i = 0; i < bit_sz; ++i) {
        ans += __builtin_popcountll(dp[i]);
    }
    return ans;
}
#line 1 "string/lcs_bit.cpp"
int LCS_bit(string &s, string &t){
    const int n = s.size(), m = t.size(), bit_sz = (m+63)>>6;
    vector<vector<ull>> p(256, vector<ull>(bit_sz, 0));
    for (int i = 0; i < m; ++i) {
        p[t[i]][i>>6] |= (1ULL << (i&63));
    }
    vector<ull> dp(bit_sz);
    for (int i = 0; i < m; ++i) {
        if(s[0] == t[i]) {
            dp[i>>6] |= (1ULL << (i&63));
            break;
        }
    }
    for (int i = 1; i < n; ++i) {
        ull shift = 1, sub = 0, tmp_sub = 0;
        for (int j = 0; j < bit_sz; ++j) {
            ull x = dp[j] | p[s[i]][j], y = (dp[j] << 1)|shift, z = x;
            shift = dp[j] >> 63;
            tmp_sub = z < sub;
            z -= sub;
            sub = tmp_sub;
            sub += z < y;
            z -= y;
            dp[j] = (z^x)&x;
        }
        dp[m>>6] &= (1LLU << (m&63))-1;
    }
    int ans = 0;
    for (int i = 0; i < bit_sz; ++i) {
        ans += __builtin_popcountll(dp[i]);
    }
    return ans;
}
Back to top page