Submission #61287469


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/modint>

namespace {
    using ModInt [[maybe_unused]] = atcoder::modint998244353;
    using Num [[maybe_unused]] = long long int;
    using Vec [[maybe_unused]] = std::vector<Num>;
    using Set [[maybe_unused]] = std::set<Num>;
    using Mset [[maybe_unused]] = std::multiset<Num>;
    using Edges [[maybe_unused]] = std::vector<std::vector<Num>>;

    template<typename T>
    using Q [[maybe_unused]] = std::queue<T>;

    template<typename T>
    using PQ [[maybe_unused]] = std::priority_queue<T, std::vector<T>, std::greater<T>>;

    const std::vector<std::pair<Num, Num>> dyxs {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    std::map<char, std::pair<Num, Num>> directions {{'D', {1, 0}}, {'U', {-1, 0}}, {'R', {0, 1}}, {'L', {0, -1}}};

    template<typename T>
    void print_oneline(const std::vector<T>& vec, std::ostream& os) {
        const auto size = vec.size();
        for(size_t i{0}; i<size; ++i) {
            os << vec.at(i) << (((i+1) == size) ? '\n' : ' ');
        }
    }

    template<typename T>
    void print_each(const std::vector<T>& vec, std::ostream& os) {
        const auto size = vec.size();
        for(size_t i{0}; i<size; ++i) {
            os << vec.at(i) << '\n';
        }
    }
}

struct StringHash {
    std::string s;
    Num b {0};
    Num mod {0};
    std::vector<Num> digests;
    std::vector<Num> multipliers;

    StringHash(const std::string& arg_s, Num arg_b, Num arg_mod) :
        s(arg_s), b(arg_b), mod(arg_mod) {
        auto size = s.size();
        Num digest = 0;
        Num multiplier = 1;
        digests.push_back(digest);
        multipliers.push_back(multiplier);

        for(decltype(size) i{0}; i<size; ++i) {
            const Num c = (mod + static_cast<Num>(s.at(i))) % mod;
            digest = ((digest * b) + c) % mod;
            digests.push_back(digest);
            multiplier = (multiplier * b) % mod;
            multipliers.push_back(multiplier);
        }
    }

    Num digest(Num left, Num right) const {
        return (mod + digests.at(right) -
                (multipliers.at(right - left) * digests.at(left)) % mod)
            % mod;
    }

    Num merge(Num left_digest, Num right_digest, Num right_len) const {
        return (right_digest + (left_digest * multipliers.at(right_len)) % mod) % mod;
    }
};


void solve(std::istream& is, std::ostream& os) {
    Num n;
    std::string s;
    is >> n >> s;

    std::map<std::pair<Num,Num>, Num> tbl;
    Num prime {1};
    prime <<= 29;
    prime -= 3;

    Num n_patterns {1};
    n_patterns <<= n;
    for(Num i{0}; i<n_patterns; ++i) {
        std::bitset<32> bits(i);
        std::string t;
        std::string u;
        for(Num j{0}; j<n; ++j) {
            if (bits[j]) {
                t.push_back(s.at(j));
            } else {
                u.push_back(s.at(j));
            }
        }

        StringHash dt(t, 256, prime);
        const auto keyt = dt.digest(0, t.size());
        StringHash du(u, 256, prime);
        const auto keyu = du.digest(0, u.size());
        tbl[std::make_pair(keyt, keyu)] += 1;
    }

    Num ans {0};
    const auto right = s.substr(n,n);
    for(Num i{0}; i<n_patterns; ++i) {
        std::bitset<32> bits(i);
        std::string t;
        std::string u;
        for(Num j{0}; j<n; ++j) {
            if (bits[j]) {
                t.push_back(s.at(n*2-1-j));
            } else {
                u.push_back(s.at(n*2-1-j));
            }
        }

        StringHash dt(t, 256, prime);
        const auto keyt = dt.digest(0, t.size());
        StringHash du(u, 256, prime);
        const auto keyu = du.digest(0, u.size());
        ans += tbl[std::make_pair(keyt, keyu)];
    }

    os << ans << "\n";
}

int main(void) {
    solve(std::cin, std::cout);
    return 0;
}

Submission Info

Submission Time
Task C - String Coloring
User zettsut
Language C++ 20 (gcc 12.2)
Score 600
Code Size 3929 Byte
Status AC
Exec Time 480 ms
Memory 36268 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 4
AC × 43
Set Name Test Cases
Sample example_0, example_1, example_2, example_3
All almost_z_0, almost_z_1, almost_z_2, almost_z_3, bigrand_0, bigrand_1, bigrand_2, example_0, example_1, example_2, example_3, handmade_0, handmade_1, nonzero_0, nonzero_1, nonzero_2, nonzero_3, nonzero_4, nonzero_5, nonzero_sc_0, nonzero_sc_1, nonzero_sc_10, nonzero_sc_11, nonzero_sc_2, nonzero_sc_3, nonzero_sc_4, nonzero_sc_5, nonzero_sc_6, nonzero_sc_7, nonzero_sc_8, nonzero_sc_9, nonzero_small_0, nonzero_small_1, nonzero_small_2, nonzero_small_3, rand_0, rand_1, rand_2, runnur_0, runnur_1, runnur_2, runnur_3, runnur_4
Case Name Status Exec Time Memory
almost_z_0 AC 265 ms 3504 KiB
almost_z_1 AC 267 ms 3468 KiB
almost_z_2 AC 262 ms 3624 KiB
almost_z_3 AC 264 ms 3444 KiB
bigrand_0 AC 400 ms 25000 KiB
bigrand_1 AC 449 ms 36268 KiB
bigrand_2 AC 411 ms 28516 KiB
example_0 AC 1 ms 3552 KiB
example_1 AC 3 ms 3640 KiB
example_2 AC 1 ms 3556 KiB
example_3 AC 261 ms 3640 KiB
handmade_0 AC 1 ms 3624 KiB
handmade_1 AC 1 ms 3436 KiB
nonzero_0 AC 409 ms 25188 KiB
nonzero_1 AC 411 ms 28132 KiB
nonzero_2 AC 470 ms 35816 KiB
nonzero_3 AC 407 ms 28012 KiB
nonzero_4 AC 437 ms 29136 KiB
nonzero_5 AC 480 ms 36140 KiB
nonzero_sc_0 AC 265 ms 3484 KiB
nonzero_sc_1 AC 287 ms 4876 KiB
nonzero_sc_10 AC 386 ms 22176 KiB
nonzero_sc_11 AC 355 ms 16620 KiB
nonzero_sc_2 AC 326 ms 7304 KiB
nonzero_sc_3 AC 332 ms 13580 KiB
nonzero_sc_4 AC 356 ms 17964 KiB
nonzero_sc_5 AC 397 ms 24932 KiB
nonzero_sc_6 AC 266 ms 3484 KiB
nonzero_sc_7 AC 275 ms 4508 KiB
nonzero_sc_8 AC 295 ms 6924 KiB
nonzero_sc_9 AC 314 ms 9924 KiB
nonzero_small_0 AC 6 ms 4192 KiB
nonzero_small_1 AC 1 ms 3512 KiB
nonzero_small_2 AC 1 ms 3492 KiB
nonzero_small_3 AC 42 ms 6612 KiB
rand_0 AC 1 ms 3508 KiB
rand_1 AC 1 ms 3552 KiB
rand_2 AC 1 ms 3548 KiB
runnur_0 AC 285 ms 4920 KiB
runnur_1 AC 270 ms 3644 KiB
runnur_2 AC 278 ms 3880 KiB
runnur_3 AC 274 ms 3872 KiB
runnur_4 AC 279 ms 4332 KiB