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 |
|
|
| 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 |