Skip to the content.

:heavy_check_mark: library/util/Subsequence.hpp

Depends on

Verified with

Code

template <typename T, typename U>
T sparse_subsequence(const std::vector<U> &v) {
    std::map<U, T> mp;
    T res = 1;
    for (const U &p : v) {
        T tmp = res;
        res = res * 2 - mp[p];
        mp[p] = tmp;
    }
    return res;
}
template <typename T, int SIZE> T subsequence(const std::vector<int> &v) {
    std::vector<T> memo(SIZE, 0);
    T res = 1;
    for (int p : v) {
        T tmp = res;
        res = res * 2 - memo[p];
        memo[p] = tmp;
    }
    return res;
}
template <typename T> T subsequence_alphabet(const std::string &s) {
    std::vector<int> v;
    v.reserve(s.size());
    for (char c : s)
        v.push_back(c - (c <= 'Z' ? 'A' : 'a'));
    return subsequence<T, 26>(v);
}
#line 1 "library/util/Subsequence.hpp"
template <typename T, typename U>
T sparse_subsequence(const std::vector<U> &v) {
    std::map<U, T> mp;
    T res = 1;
    for (const U &p : v) {
        T tmp = res;
        res = res * 2 - mp[p];
        mp[p] = tmp;
    }
    return res;
}
template <typename T, int SIZE> T subsequence(const std::vector<int> &v) {
    std::vector<T> memo(SIZE, 0);
    T res = 1;
    for (int p : v) {
        T tmp = res;
        res = res * 2 - memo[p];
        memo[p] = tmp;
    }
    return res;
}
template <typename T> T subsequence_alphabet(const std::string &s) {
    std::vector<int> v;
    v.reserve(s.size());
    for (char c : s)
        v.push_back(c - (c <= 'Z' ? 'A' : 'a'));
    return subsequence<T, 26>(v);
}
Back to top page